我已经用 Ubuntu 12.04 和 Debian 7 对此进行了测试。当我这样做时
echo $TERM
我明白了
xterm
但如果我使用下拉菜单“帮助”>“关于”,那么它会显示gnome terminal 3.4.1.1
。
这是否意味着我只使用 gnome-terminal ?或者只是xterm?或者 gnome-terminal 是 xterm 的扩展?我很困惑。
答案1
是$TERM
为了什么?
该$TERM
变量供应用程序使用以利用该终端的功能。
例如,如果程序想要显示彩色文本,它必须首先查明您使用的终端是否支持彩色文本,然后如果支持,则如何显示彩色文本。
其工作原理是系统保留已知终端及其功能的库。在大多数系统上都有这个/usr/share/terminfo
(还有 termcap,但它是遗留的,不再使用了)。
假设您有一个程序想要显示红色文本。它基本上会调用 terminfo 库,上面写着“给我我必须为 xterm 终端发送红色文本的字节序列”。然后它只需要这些字节并将它们打印出来。
您可以通过执行 自己尝试tput setf 4; echo hi
。这将获得setf
terminfo 功能并向其传递一个参数4
,这是您想要的颜色。
为什么 gnome 终端会撒谎:
现在假设您有一些刚刚发布的闪亮的新终端模拟器,并且系统的 terminfo 库还没有它的定义。当您的应用程序去查找如何执行某些操作时,它会失败,因为终端未知。
你的终端解决这个问题的方法是谎报它是谁。所以你的 gnome 终端显示“我是 xterm”。
Xterm 是一个非常基本的终端,自 X11 诞生以来就已经存在,因此大多数终端仿真器都支持它所支持的功能。因此,通过 gnome 终端说它是一个 xterm,它更有可能在 terminfo 库中有一个定义。
谎报终端类型的缺点是终端实际上可能支持比 xterm 更多的功能(例如,许多新终端支持 256 种颜色,而旧终端仅支持 16 种颜色)。因此,您需要进行权衡,是获得更多功能,还是拥有更多兼容性。大多数终端会选择更高的兼容性,因此选择将自己宣传为xterm
.
如果您想覆盖此设置,许多终端将提供某种配置该行为的方法。但你也可以这样做export TERM=gnome-terminal
。
答案2
环境TERM
变量表示终端类型,不是终端应用。TERM
有一个特定的目的:它告诉在该终端中运行的应用程序如何与终端交互。
应用程序通过编写转义序列与终端进行交互,转义序列是包含不可打印字符的字符序列,具有移动光标、擦除部分屏幕、更改当前颜色等效果。在过去,不同品牌的物理终端具有不同的功能。转义序列集。因此,操作系统维护终端类型及其特征的数据库。传统的数据库是术语帽(“终端能力”);许多现代系统和应用程序已经转向术语信息。这两个数据库都按终端类型的名称进行索引,应用程序使用TERM
环境变量中的终端类型名称来查询它们。
如今,大多数终端都使用标准转义序列集具有一些常见的扩展集,因此您不会看到 的许多不同值TERM
。大多数 GUI 终端仿真器都兼容xterm,传统的X终端(仍在使用和维护)。
与 xterm 不同的终端仿真器可能会以自己的名称将自己的条目添加到终端数据库中。然而,这与远程 shell 并不能很好地配合。一个程序在A机上运行,但在B机上显示,例如从B到A是通过ssh启动的,需要查询A机上的终端数据库。ssh等远程登录方式会携带环境变量TERM
,但是仅当 B 的终端数据库也有 A 上的价值用户的条目时,这才有用。因此,许多终端仿真器坚持使用TERM=xterm
几乎众所周知的条目。
总的来说,终端之间的区别并不在于应用程序与它们交互的方式,而是在于终端与用户交互以及适应其环境的方式。例如,Gnome Terminal 在 Gnome 上看起来不错,并提供选项卡和其他细节; Konsole 在 KDE 上看起来不错,并提供选项卡和其他细节; urxvt 的内存需求较小; Console2 在 Windows 上运行; screen 和 tmux 提供可以附加到不同父终端的会话;等等。由于这些功能都不会影响终端中运行的应用程序,因此大多数终端模拟器都使用TERM=xterm
.
要找出 shell 正在哪个终端运行(假设 shell 直接在终端中运行),请查看 shell 的父级:
ps -p$PPID
答案3
环境变量 TERM 并不代表您正在使用的终端。
环境变量 TERM 包含文本窗口功能的标识符。您可以使用 > 'infocmp' 命令获取这些功能的详细列表,并使用 'man 5 terminfo' 作为参考。
当生成带有嵌入颜色指令的文本时,msgcat 会查看 TERM 变量。如今的文本窗口通常至少支持 8 种颜色。然而,文本窗口通常支持 16 种或更多颜色,即使 TERM 变量设置为仅表示 8 种支持颜色的标识符。在这些情况下,值得将 TERM 变量设置为不同的值:
xterm在大多数情况下,它支持 16 种颜色。它还可以支持 88 或 256 色(但不能同时支持两者)。您可以尝试将 TERM 设置为 xterm-16color、xterm-88color 或 xterm-256color。接收值
接收值通常支持 16 种颜色。您可以尝试将 TERM 设置为 rxvt-16color。控制台
控制台Too 通常支持 16 种颜色。您可以尝试将 TERM 设置为 konsole-16color 或 xterm-16color。
设置 TERM 后,您可以通过调用“msgcat --color=test”来验证它并查看输出是否看起来像合理的颜色图。环境变量 TERM 包含文本窗口功能的标识符。您可以使用“infocmp”命令获取这些功能的详细列表,并使用“man 5 terminfo”作为参考。
答案4
我认为值得注意的是,您可以通过运行找到您最初问题的答案ps -p $$
,即了解当前pid的进程是什么。示例输出为:
PID TTY TIME CMD
3045221 pts/17 00:00:00 bash
这很清楚它是什么终端。