$ TERM的解释方式和位置?


9

我想知道某些内部魔术如何工作。

在使用docker容器时,$TERM未设置环境变量。这导致看起来奇怪的控制台应用程序(例如vim和tmux),但也导致CTRL + l(清晰屏幕)被忽略。

我很确定所有功能(例如部分屏幕更新,颜色,命令(例如屏幕重置)等)都使用转义码实现了,对吗?

那么,该变量在何处解释,并且如果在其中设置了正确的值,则允许使用CTRL + 1重置终端屏幕?谁来检查例如支持哪些颜色(xterm与xterm-256color)?贝壳?该应用程序还是像ncurses这样的库?在哪里定义可能的值/端子类型?

Answers:


8

$TERM由terminfo系统读取和解释。terminfo还指的是终端说明的数据库,您可以在中的大多数系统上找到它们/usr/share/terminfo$TERM必须与该数据库中的一项匹配。还有一个名为termcap的较旧的库,它的功能较少,但terminfo取代了它。在现代系统中,terminfo是ncurses库的一部分。

应用程序通常要么直接使用类似库的功能来获取终端功能,要么tigetstr()使用更高级别的curses接口来管理屏幕的布局。无论哪种方式,都$TERM将查询terminfo数据库。


5

TERM每个应用程序都通过系统库解释该变量。它的值是在数据库中查找的名称。根据Unix的风格和时代的不同,数据库可以是termcap(传统的,如今不常用)或terminfo(现代的,因为这是对termcap的改进,并且如今已被大多数系统使用)。

termcap和terminfo数据库都将功能名称与值相关联。功能要么是对终端可以做什么的描述(行数,加下划线的能力等),要么是可以与终端交换的字符串(转义序列以格式化文本,四处移动光标等),或者在另一个终端中进行描述。功能键发送的方向转义序列)。您可以查看man 5 termcapman 5 terminfo查看系统上已知的功能。

例如,当您按Ctrl+ L重新绘制屏幕时,它将读取终端数据库中的功能,以查明必须使用哪些转义序列来移动光标。如果TERM未设置或设置不正确,屏幕将无法知道如何移动光标。

您可以使用该tput命令检索terminfo数据库中的条目。例如,tput lines打印出终端上的行数。tput clear清除屏幕(因为其输出已在终端上打印);要查看相应的转义序列是什么,请以可读的形式(例如)将其打印出来tput clear | cat -v

颜色的数量已有相当长的历史,因此无法正常使用:终端仿真器往往会少报颜色数量,以避免破坏某些应用程序。有关更多信息请参见tmux,TERM和256色支持,尤其是在tmux的情况下。xterm-256colors和之间的区别xterm是,前者报告terminfo中的256种颜色,而后者报告传统的8种颜色。


2

TERM按惯例是指终端描述。最初,它命名为termcap文本文件的一部分(始于1970年代后期)。在1980年代中期,terminfo作为已编译的(二进制)文件被引入,节省了获取终端描述时的时间。虽然两者都可用于所有类Unix平台,但除作为termterm的仿真外,termcap目前很少使用。

对于这两种数据格式,应用程序通常使用可重用的编程库从终端数据库中提取数据。terminfo编程库通常是高级curses库的一部分,尽管它可以作为单独的库文件提供(例如,可选地像在ncurses中一样)。无论是否单独提供terminfo库,在这种情况下,它都被视为curses库的一部分。(还有一些其他高级库,例如slang)。

每个终端的终端数据库条目包含称为功能的属性。他们告诉curses库(或直接使用termcap / terminfo的应用程序)如何进行有用的操作,例如清除屏幕。对于大多数终端,这是一个转义序列。为此,一些终端可能不支持转义序列。curses库还可以结合使用其他功能来清除屏幕(例如清除每一行)。并非所有功能都是转义序列。有布尔数量的能力,以及,例如,告诉是否一个功能支持,以及如何大东西(比如屏幕大小)。

每个使用termcap / terminfo的应用程序都使用相应的库来检索终端描述,并执行诸如将参数替换为某些功能的操作。例如,大多数终端都具有将光标从其当前位置移动给定数量的列或行的功能。的tparm(或tiparm)功能的替代的数量成的能力,以获得实际的转义序列。

curses库具有维护终端数据库(ticinfocmp)的命令行应用程序,一些命令行应用程序在shell脚本中用于查询终端数据库或执行具有终端功能(tputtset / reset)的低级操作。

有些非常规应用程序TERM无需使用终端数据库就可以使用。其中大多数简单地对它们的行为进行硬编码(例如GNU grep,groff和links / links2 / elinks文本Web浏览器),而少数具有与自己的终端数据库相当的内容(例如GNU ls),但是使用不同的规则和行为。

返回问题:

  • 那么,该变量在何处解释,并且如果在其中设置了正确的值,则允许使用CTRL + 1重置终端屏幕?

    应用程序底层库解释该值。对于controlL,可以在readline库(使用termcap编程接口)中对bash进行此操作。

  • 谁来检查例如支持哪些颜色(xterm与xterm-256color)?

    终端数据库将颜色的数量存储为一种功能,以及用于设置前景色和背景色以及重置颜色的功能。某些应用程序将这些功能与其他信息(例如,开发人员的xterm“确实” 断言xterm-256color)结合在一起。

  • 贝壳?

    大多数外壳使用termcap编程接口来获取终端信息。但是,它们是具有自己行为的应用程序(不一定与curses相同)。

  • 该应用程序还是像ncurses这样的库?

    (请参见上文:shell是一种特殊类型的应用程序)

  • 在哪里定义可能的值/端子类型?

    通常,它位于使用curses或slang库的应用程序共享的终端数据库中。一些应用程序是硬编码的或使用私有数据库。

进一步阅读:

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.