我想知道有些终端魔法内部工作。
在使用 docker 容器时,$TERM
未设置环境变量。这导致了 vim 和 tmux 等看起来很奇怪的控制台应用程序,而且还导致 CTRL+l(清屏)被忽略。
我很确定所有特征像部分屏幕更新、颜色、屏幕重置等命令都是使用转义码实现的,对吗?
那么这个变量在哪里解释,并且如果我在那里设置了正确的值,则允许使用 CTRL+l 重置我的终端屏幕? WHO检查例如支持哪些颜色(xterm 与 xterm-256color)?贝壳?应用程序还是像 ncurses 这样的库?可能的值/终端类型在哪里定义?
答案1
$TERM
由 terminfo 系统读取和解释。 terminfo 还指终端描述数据库,您可以在 中的大多数系统上找到该数据库/usr/share/terminfo
。$TERM
必须与该数据库中的条目之一匹配。还有一个名为 termcap 的旧库,其功能较少,但 terminfo 已取代它。在现代系统中,terminfo 是 ncurses 库的一部分。
应用程序通常要么直接使用库函数获取终端功能,例如tigetstr()
或者他们使用更高级别的 Curses 接口来管理屏幕布局。无论哪种方式,$TERM
都会查阅 terminfo 数据库。
答案2
TERM
每个应用程序通过系统库解释该变量。它的值是在数据库中查找的名称。根据 Unix 风格及其年龄,数据库可以是术语帽(传统的,现在不常用)或术语信息(现代,因为它是对 termcap 的改进,并且现在被大多数系统使用)。
termcap 和 terminfo 数据库都将功能名称与值相关联。功能要么是对终端可以执行的操作的描述(行数、下划线能力等),要么是可以与终端交换的字符串(转义序列以格式化文本、移动光标等,而在另一个中由功能键发送的方向转义序列)。你可以看看man 5 termcap
和man 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 种颜色。
答案3
TERM
, 经过习俗指终端描述。最初这被命名为a的一个部分术语帽文本文件(从 20 世纪 70 年代末开始)。在 20 世纪 80 年代中期,术语信息作为编译(二进制)文件引入,可以节省获取终端描述的时间。虽然两者都可用于所有类 Unix 平台,但 termcap 目前很少使用,除非用作使用 terminfo 的模拟。
对于这两种数据格式,应用程序通常使用可重用的编程库从终端数据库中提取数据。 terminfo 编程库通常是高级curses 库的一部分,尽管它可以作为单独的库文件提供(例如,可选地如在ncurses 中)。无论 terminfo 库是否单独提供,在这些情况下,它都被视为curses 库的一部分。 (还有一些其他高级库,例如俚语)。
每个终端的终端数据库条目包含称为能力。它们告诉curses库(或直接使用termcap/terminfo的应用程序)如何执行有用的操作,例如清除屏幕。对于大多数终端来说,这是一个转义序列。一些终端可能不支持用于此目的的转义序列; Curses 库还可以结合其他功能来清除屏幕(例如清除每一行)。并非所有功能都是转义序列。有布尔值和数字以及能力,例如,告诉无论支持一项功能,并且多大某些东西(例如屏幕尺寸)。
每个使用 termcap/terminfo 的应用程序都使用相应的库来检索终端描述,以及执行诸如将参数替换为某些功能等操作。例如,大多数终端都提供将光标从当前位置移动给定数量的列或行的功能。tparm
(或)函数tiparm
将数字替换为能力以获得实际的转义序列。
curses 库具有维护终端数据库的命令行应用程序(抽动症,信息CMP)以及一些在 shell 脚本中用于查询终端数据库或使用终端功能执行低级操作的命令(输出,tset/重置)。
有非传统的TERM
不使用终端数据库而使用的应用程序。其中大多数只是硬编码其行为(例如 GNU grep、groff 和 links/links2/elinks 文本 Web 浏览器),而很少拥有相当于自己的终端数据库(例如 GNU ls),但使用不同的规则和行为。
回到问题:
那么这个变量在哪里解释,并且如果我在那里设置了正确的值,则允许使用 CTRL+l 重置我的终端屏幕?
应用程序和底层库解释这个值。对于controlL,这可以在 readline 库(使用 termcap 编程接口)中为 bash 完成。
例如,谁检查支持哪些颜色(xterm 与 xterm-256color)?
终端数据库将颜色数量存储为一种能力,以及设置前景色和背景色以及重置颜色的能力。一些应用程序将这些功能与其他信息(例如开发人员的
xterm
“确实”断言xterm-256color
)结合起来。贝壳?
大多数 shell 使用 termcap 编程接口来获取终端信息。然而,它们是有自己行为的应用程序(不一定与curses相同)。
应用程序还是像 ncurses 这样的库?
(参见上文:shell 是一种特定类型的应用程序)
可能的值/终端类型在哪里定义?
通常,它位于使用curses 或俚语库的应用程序共享的终端数据库中。某些应用程序是硬编码的或使用私有数据库。
进一步阅读: