我想知道命令行应用程序的“ GUI”如何通过网络进行通信。大多数时候,它很简单(纯文本/输入),但有时却更复杂(智能)。
它是否由某种标准定义,以便任何人都可以编写自己的终端,并且所有终端实现均以相同的方式运行(颜色,位置等)?
我想知道命令行应用程序的“ GUI”如何通过网络进行通信。大多数时候,它很简单(纯文本/输入),但有时却更复杂(智能)。
它是否由某种标准定义,以便任何人都可以编写自己的终端,并且所有终端实现均以相同的方式运行(颜色,位置等)?
Answers:
控制台程序通常使用curses或其继任者¹来构建您正在谈论的各种文本用户界面。
这些库使用两个数据库中的一个,叫termcap
和terminfo
.²这些数据库包含地图,告诉发送,从而获得所需与大量不同的终端类型的动作是什么代码库。您将在这些数据库中找到的绝大多数终端类型都无法在真正的终端时代生存下来,因此现在仅具有历史意义。
现代的Unix终端仿真器³使用ANSI X3.64协议或其更高版本之一:
ANSI X3.64:一种与“电传打字机 ”相对的控制“玻璃终端”的标准,它基于远程终端解释的特殊字符序列。例如,如果Unix框要告诉ANSI X3.64兼容终端将其光标移动到屏幕的左上角,它将发送字符ESC
[
1
;
1
H
。前两个字符告诉终端期望一个控制序列,第一个字符是行和列,并且H
是表示“移动光标”的命令。
DEC VT100:Digital Equipment Corporation的VT100是第一个真正流行的ANSI兼容玻璃端子。通过在市场上证明ANSI的法律标准,它建立了今天仍然很重要的事实上的标准。
有时您会看到这种称为VT102协议的协议,它是后来降低成本的VT100协议,因此更加流行,它是VT100加上内置的所有可用扩展选项的版本。
DEC终端协议是向后兼容的系列,从1978年推出的第一个ANSI兼容模型(VT100)一直扩展到Boundless Technologies在1995年从DEC收购终端业务之后生产的VT500系列模型。(Boundless是现已停业,但其终端仍会不时出现在二手市场上。)
xterm:ANSI和VT-不管什么标准的一种组合。每当您使用GUI终端仿真器之类xterm
的或其衍生工具之一时,通常还使用xterm
终端协议,通常是较现代的版本xterm-color
或xterm-color256
变体。
Linux:Linux控制台也使用ANSI终端协议的扩展变体,其实质与xterm
协议相同。它的大多数扩展都与PC和玻璃终端之间的差异有关。例如,IBM键盘有一些不在DEC VT上的键,无论如何。(反之亦然。)
某些Unix系统也有自己的控制台终端协议。例如,有scoansi
针对SCO Unix 的ANSI X3.64变体。
一个典型的终端仿真器程序有点杂种,并且不能完全模拟任何单个终端模型。它可能支持VT320之前的所有DEC VT转义序列的96%,而且还支持ANSI颜色(VT525功能)和任意数量的行和列的扩展。如果您的程序不需要这些4%的代码,那么即使您已经告知curses
(或其他任何情况)您希望使用它的程序使用VT320协议,也可能会错过它无法理解的4%的代码。这样的程序可能会宣称自己与VT320兼容,即使严格来讲,它也不是。⁵
有时您还会遇到其他一些值得注意的标准:
Wyse: Wyse是玻璃终端的最早的独立生产商之一,于1980年代初开始制造终端,之后工作站计算开始取代微型计算机。尽管Wyse终端能够仿真VT100和其他流行的终端协议,但它们也具有自己的本机代码。
IBM 3270:尽管严格来说这不是“ Unix”终端类型,但是将Unix系统连接到IBM大型机的需求导致创建了IBM 3270系列终端仿真器程序,您仍然可以使用它。后来的 IBM 5250系列终端机的仿真器也相当普遍,如今最常用于连接 AS / 400和System i小型计算机。
Tektronix 4014:在PC和工作站大大取代玻璃终端并因此使位图图形成为标准功能之前,存在昂贵的图形终端,它们响应类似于上述转义序列的文本命令在屏幕上绘制图形。其中可能最受欢迎的是泰克4010系列。
他们使用起来很有趣。您可以编写一个绘制图形的程序,然后可以将其输出重定向到文件中,而不是简单地运行它以在本地终端上进行绘制:
$ ./my4014program > my-neat-graphic
然后,您可以将该文件发送给其他人,他们可以cat
在其Tek终端上将其保存而无需执行程序即可查看图形。吸引人的部分原因是这些终端在绘制时的速度很慢,因此您可以在几秒钟内观看图形的积累。
您可以curses
通过查看TERM
环境变量来找出您要库使用的终端标准:
$ echo $TERM
xterm-color
当您ssh
转到另一个系统时,该TERM
变量会随身携带,因此远程Unix盒知道如何与本地终端进行通信。
由于这些协议中有许多是ANSI X3.64的变体,并且由于无处不在的ASCII和UTF-8字符编码标准会处理很多其他问题,因此错误的TERM
变量通常不会造成灾难性的后果。容易中断的事情包括扩展键(例如Home和Page Up),Alt键(无论如何组合)以及印刷显示功能(例如颜色,黑体字等)。
脚注:
最常见的是ncurses。
该curses
API 也有其他竞争对手,例如S-Lang。
AT&T颁布terminfo
了BSD termcap
数据库的替代品,并且在取代BSD方面取得了很大的成功,但是仍然有程序在使用旧termcap
数据库。它是您仍然可以在现代系统上找到的许多BSD与AT&T差异之一。
我的macOS盒没有/etc/termcap
,但它确实有/usr/share/terminfo
,而FreeBSD的标准安装是相反的,即使这两个OS在命令行级别通常非常相似。
正确编写的Unix程序不会直接发出这些转义序列。相反,他们使用上述库之一,告诉它“将光标移动到位置(1,1)”或其他内容,并且库根据您的TERM
环境变量设置发出必要的终端控制代码。无论您使用哪种终端类型,都可以使程序正常运行。
旧的文本终端具有很多奇怪的功能,程序并没有大量使用它们,因此许多流行的终端仿真器程序根本没有实现这些功能。常见的遗漏是支持Sixel图形和双倍宽度/双倍高度文本模式。
的维护者xterm
编写了一个程序,vttest
用于测试VT终端仿真器,例如xterm
。您可以将其与其他终端仿真器一起运行,以找出它们不支持的功能。