我正在使用哪种终端机类型?


51

我已经在Ubuntu 12.04和Debian 7上对此进行了测试。

echo $TERM

我懂了

xterm

但是,如果我使用下拉菜单“帮助”>“关于”,则会显示gnome terminal 3.4.1.1

这是否意味着我只使用gnome-terminal?还是xterm?还是gnome-terminal是xterm的扩展?我糊涂了。

Answers:


49

$TERM为了什么?

$TERM变量供应用程序使用以利用该终端的功能。

例如,如果程序要显示彩色文本,则它必须首先确定您使用的终端是否支持彩色文本,然后,如果支持,则如何处理彩色文本。

这种工作方式是系统保留已知终端及其功能的库。在大多数系统上,这是/usr/share/terminfo存在的(也有termcap,但它的遗产不再使用了)。

假设您有一个要显示红色文本的程序。它基本上是对terminfo库的调用,它说“ 给我xterm终端必须为红色文本发送的字节序列 ”。然后,它只占用这些字节并打印出来。
您可以这样做自己尝试tput setf 4; echo hi。这将获得setfterminfo功能,并为其传递参数4,这是您想要的颜色。


为什么gnome终端机谎言自己:

现在,假设您有一个刚刚发布的闪亮的新终端仿真器,并且系统的terminfo库尚未定义。当您的应用程序去查找如何做某事时,它将因终端未知而失败。

终端如何解决这个问题的方法就是说谎。因此,您的gnome终端说“ 我是xterm ”。

Xterm是从X11诞生以来就已经存在的非常基本的终端,因此大多数终端仿真器都支持它所支持的功能。因此,通过gnome终端说这是一个xterm,它更有可能在terminfo库中有一个定义。

谎言您的终端类型的缺点是终端实际上​​可能比xterm支持更多(例如,许多新终端支持256色,而旧终端仅支持16色)。因此,您需要权衡,获得更多功能或具有更多兼容性。大多数终端会选择更高的兼容性,因此选择将自己广告为xterm

如果要覆盖此设置,许多终端将提供某种配置行为的方式。但是你也可以做export TERM=gnome-terminal


4
推荐某人出口$ TERM真的像是在开放的伤口上撒盐……
jasonwryan

1
是的 我猜测gnome-terminal的开发人员$TERM设置xterm为有很好的理由
mulllhausen

4
@mulllhausen我的回答中已经很好地解释了这个原因……
Patrick

27

TERM环境变量表示终端类型,而不是终端应用TERM有一个特定的目的:告诉运行在该终端中的应用程序如何与该终端进行交互。

应用程序通过编写转义序列与终端进行交互,转义序列是包括不可打印字符的字符序列,它们具有诸如移动光标,擦除屏幕的一部分,更改当前颜色等效果。在过去,不同品牌的物理终端具有不同的转义序列集。因此,操作系统维护终端类型及其特征的数据库。传统的数据库是termcap(“终端能力”);许多现代系统和应用程序已切换到terminfo。这两个数据库均以终端类型的名称进行索引,并且应用程序使用TERM环境变量中的终端类型名称来查询它们。

如今,大多数终端都使用标准的转义序列集和一些常见的扩展集,因此您不会看到的许多不同值TERM。大多数GUI终端仿真器与传统的X终端xterm(仍在使用和维护)兼容。

与xterm不同的终端仿真器可以使用自己的名称将自己的条目添加到终端数据库中。但是,这与远程shell不能很好地配合。例如,由于是通过ssh从B到A启动的,因此在A机上运行但正在B机上显示的程序需要查询A机上的终端数据库。远程登录方法(例如ssh)会继承TERM环境变量,但是仅当B的终端数据库在A上也有值用户的条目时,这才有用。因此,许多终端仿真器都坚持使用TERM=xterm它,这是众所周知的。

终端之间的区别主要不在于应用程序与终端交互的方式,而在于终端与用户交互并适应其环境的方式。例如,Gnome Terminal在Gnome上看起来不错,并提供选项卡和其他功能。Konsole在KDE上看起来不错,并提供选项卡和其他功能。urxvt的内存需求很小;Console2在Windows上运行;屏幕和tmux提供可以附加到不同父终端的会话;等等。由于这些功能都不会影响终端中运行的应用程序,因此大多数终端仿真器都使用TERM=xterm

要找出shell在哪个终端上运行,请查看shell的父代:

ps -p$PPID

运行ps -p$PPID似乎并不能告诉我我正在运行哪个终端。或至少不是以我理解的方式。您是否有示例输出/响应?
user3731622 '18

@user输出是一串数字和隐含的缩写,后跟命令行。在大多数情况下,命令行是启动运行外壳程序的终端仿真器的命令行。
吉尔斯(Gilles)'“ SO-不要邪恶”

12

环境变量TERM并不表示您正在使用的终端。

引用gnu.org

环境变量TERM包含文本窗口功能的标识符。您可以使用>'infocmp'命令并以'man 5 terminfo'作为参考来获得这些功能的详细列表。

在生成带有嵌入式颜色指令的文本时,msgcat会查看TERM变量。今天的文本窗口通常至少支持8种颜色。但是,即使TERM变量设置为仅表示8种受支持颜色的标识符,文本窗口通常也支持16种或更多颜色。在以下情况下,值得将TERM变量设置为其他值:

在大多数情况下,xterm都支持16种颜色。它也可以支持88或256种颜色(但不能同时提供)。您可以尝试将TERM设置为xterm-16color,xterm-88color或xterm-256color。收视率

rxvt通常支持16种颜色。您可以尝试将TERM设置为rxvt-16color。康索尔

konsole通常也支持16种颜色。您可以尝试将TERM设置为konsole-16color或xterm-16color。

设置TERM之后,您可以通过调用'msgcat --color = test'并查看输出是否看起来像合理的颜色图来进行验证。环境变量TERM包含文本窗口功能的标识符。您可以使用“ man 5 terminfo”作为参考,使用“ infocmp”命令来获得这些功能的详细列表。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.