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