不同终端类型($TERM)之间如何兼容?

不同终端类型($TERM)之间如何兼容?

例如,在我设置TERM=xterm,然后我登录到Linux服务器并在命令行中运行export TERM=linux,然后我开始screen -T screen(意思是TERM=screen)。

我很困惑这些$TERM类型如何相互作用,因为这一切似乎都没有问题。不同$TERM类型的设计是否是为了兼容而设计的?

答案1

不幸的是...如果它们都兼容的话,$TERM 就不会被发明了。

如今,大多数终端仿真器大多兼容。但并非完全兼容。它们经常模仿 Xterm(我认为 Xterm 本身模仿的是物理 VT320)——但并非所有的 Xterm 都支持每个功能,有时基本功能也不同。

例如,在使用基本应用程序时,Urxvt 也类似于 Xterm……直到您注意到用于特殊键的代码都不同!如果您在 Urxvt 中使用 TERM=xterm 或反之亦然,则箭头键或 Home/End 将不起作用。

您选择的 TERM=linux 有非常功能有限。它不支持下划线、斜体或粗体文本,不支持 256 色或真彩色格式,不支持鼠标输入。它不任何如果您使用 PuTTY 或任何其他图形终端,则设置 TERM=linux 是有意义的。

幸运的是,限制性更强的 $TERM 通常只会让事情看起来更丑陋和/或更慢。(颜色会更少,甚至没有。如果程序被告知不能使用通常的快速方式,它们将使用更繁琐的方式重新绘制屏幕。等等。)但是,做相反的事情可能会使程序完全无法使用,因为程序会尝试以终端无法应对的方式执行操作。

因此一般来说,仅有的您应该更改 $TERM 的时间是当您确定终端支持更好的终端时。PuTTY 和 Screen 都是很好的例子,因为它们在最新版本中支持 256 色代码,因此可以将 TERM=screen 更改为 TERM=screen-256color 等。Tmux 有第二个示例 - 它以前也使用 TERM=screen,但现在有自己的 TERM=tmux,因此可以进行这样的更改。

但你永远不应该需要在完全不同的系列之间更改 TERM(除了在网络串行等极少数情况下,服务器无法检测正确的值)。

用于infocmp -L比较两个 terminfo 条目。(可能会有一些不必要的差异和错误,但总体上仍能为您提供良好的概览。)

相关内容