一、命令概述
infocmp 是一个用于 比较或输出 terminfo 描述 的工具,其核心功能包括:
- 比较多个终端描述的差异(如布尔值、数值、字符串能力)。
- 生成 terminfo 源码列表(支持 terminfo 名称、C 变量名、termcap 名称)。
- 转换 terminfo 到 termcap 格式(支持兼容性调整)。
- 分析 use= 字段(生成相对描述以复用通用定义)。
⚠️ 注意事项
- terminfo 是存储终端功能的数据库,termcap 是旧版文本格式。
- 默认情况下,infocmp 会从 /usr/share/terminfo 或环境变量 TERMINFO 中读取数据。
- 使用 infocmp 时需确保终端名称存在(如 xterm-256color)。
二、基本语法
infocmp [选项] [终端名...]
参数说明:
- [选项]:控制输出格式、比较模式等(详见下文)。
- [终端名…]:指定要比较或输出的终端名称(如 vt100 xterm)。
三、核心选项详解
1. 比较模式
-d | 显示不同终端间的差异(仅布尔/数值/字符串字段) | infocmp -d vt100 xterm |
-c | 显示多个终端的共通能力(忽略未设置的字段) | infocmp -c vt100 xterm |
-n | 显示未在任何终端中定义的能力 | infocmp -n vt100 xterm |
2. 源码生成
-I | 使用 terminfo 名称输出源码 | infocmp -I vt100 |
-L | 使用 <term.h> 中的 C 变量名输出源码 | infocmp -L vt100 |
-C | 使用 termcap 名称输出源码(需结合 -r) | infocmp -C -r vt100 |
-K | 优化 termcap 兼容性(BSD 风格) | infocmp -C -K vt100 |
-r | 输出所有能力(不限于 termcap 支持字段) | infocmp -C -r vt100 |
3. use= 分析
-u | 生成第一个终端的相对描述(基于其他终端的 use= 字段) | infocmp -u vt100 xterm |
4. 数据库管理
-A directory | 指定第一个终端的数据库路径 | infocmp -A /custom/db vt100 |
-B directory | 指定其他终端的数据库路径 | infocmp -B /custom/db vt100 xterm |
5. 其他选项
-0 | 单行输出(不换行) | infocmp -0 vt100 |
-1 | 每个字段独占一行 | infocmp -1 vt100 |
-a | 保留注释字段(以 . 开头) | infocmp -a vt100 |
-D | 打印数据库搜索路径并退出 | infocmp -D |
-E | 输出 C 结构体初始化表 | infocmp -E vt100 |
四、核心功能详解
1. 比较终端差异
infocmp -d vt100 xterm
- 效果:列出 vt100 和 xterm 在布尔、数值、字符串能力上的差异。
- 输出示例:Comparing vt100 to xterm.
First terminal: vt100
Second terminal: xterm
Differences:
num: colors@ vs 8
str: setab=\\E[4%p1%dm vs \\E[48;5;%p1%dm
2. 生成 termcap 格式
infocmp -C -r -K vt100
- 效果:将 vt100 的 terminfo 描述转换为兼容 BSD 的 termcap 格式。
- 适用场景:旧系统或工具仅支持 termcap 时使用。
3. 生成相对描述(use= 字段)
infocmp -u vt100 xterm
- 效果:生成 vt100 的描述,并尝试复用 xterm 的定义。
- 输出示例:vt100|xterm compatible terminal,
use=xterm,
cols#80,
lines#24,
4. 输出 C 结构体
infocmp -E vt100
- 效果:生成 TERMTYPE 结构体的 C 初始化代码。
- 适用场景:开发自定义终端库时直接嵌入能力表。
五、实际应用示例
示例 1:查看默认终端的 terminfo 源码
infocmp -I
- 输出:当前环境变量 TERM 对应的终端描述(如 xterm-256color)。
示例 2:将 terminfo 转换为 termcap 并保存
infocmp -C -r vt100 > vt100.termcap
- 效果:生成 vt100 的 termcap 文件,供旧系统使用。
示例 3:比较两个终端的共通能力
infocmp -c vt100 ansi
- 输出:列出 vt100 和 ansi 的共通字段,验证是否可复用定义。
示例 4:生成单行格式的 terminfo 描述
infocmp -0 vt100
- 效果:所有字段合并为一行,便于脚本解析。
六、注意事项
终端名称匹配:
- 若终端名不存在,infocmp 会报错(如 unknown terminal: unknown)。
- 可通过 toe 命令查看系统支持的终端列表。
termcap 转换限制:
- termcap 不支持某些 terminfo 的参数化字符串(如 %p1%'x'%+%c)。
- 转换后需手动编辑注释掉的部分(以 # 开头)。
use= 字段顺序:
- use= 字段的顺序影响最终编译结果(tic 从左到右解析)。
- 使用 -u 时应按优先级排序终端名。
数据库路径问题:
- 若 infocmp 无法找到终端描述,可设置 TERMINFO 环境变量:export TERMINFO=/custom/terminfo
输出格式控制:
- 使用 -1 选项可提高可读性(每字段独立一行)。
- 使用 -0 选项适合脚本处理(单行输出)。
七、常见问题解答
Q1: 如何查看支持的终端列表?
- 方法:toe
Q2: 如何将 terminfo 转换为 termcap?
- 方法:infocmp -C -r vt100 > vt100.termcap
Q3: 如何生成 C 结构体初始化代码?
- 方法:infocmp -E vt100
Q4: 如何比较多个终端的共通能力?
- 方法:infocmp -c vt100 xterm ansi
Q5: 如何指定自定义数据库路径?
- 方法:infocmp -A /custom/db -B /custom/db vt100 xterm
八、总结表格:常用命令用途一览
infocmp -d vt100 xterm | 比较 vt100 和 xterm 的差异 | 快速定位兼容性问题 |
infocmp -C -r vt100 | 生成 termcap 格式的 vt100 描述 | 兼容旧系统 |
infocmp -u vt100 xterm | 生成 vt100 的相对描述(复用 xterm) | 减少重复定义 |
infocmp -E vt100 | 输出 vt100 的 C 结构体初始化表 | 嵌入开发代码 |
infocmp -0 vt100 | 单行输出 vt100 的描述 | 脚本解析友好 |
infocmp -D | 打印数据库搜索路径 | 调试路径问题 |
评论前必须登录!
注册