打开 mac 的「终端」或者 iTerm2,你会看到一个黑乎乎(或者白花花)的窗口,里面有一行字在闪:$。这本书要回答的问题是:你在这个窗口里敲下一个键,到屏幕上多出一个字符,再到千里之外的服务器帮你执行一条命令,中间到底发生了什么?
但在回答这个问题之前,得先解决一个更基本的疑惑:这东西为什么叫「终端」?终端是谁的末端?
计算机曾经是房间里的大象
1960 年代的计算机不是摆在桌上的东西,而是一整个房间:成排的机柜、嗡嗡作响的磁带机,一台机器要几百万元,一所大学可能只有一台。这么贵的东西,当然不能一个人独占——于是人们发明了分时系统:主机把时间切成极小的片,轮流服务几十个用户,快得让每个人都觉得机器是自己的。
问题来了:几十个用户怎么同时用一台机器?答案就是终端(terminal,「末端」)——主机是大脑,终端是伸到各个角落的神经末梢:一个键盘,加一个输出设备,中间一根线连到主机。终端自己几乎没有计算能力,它只负责两件事:把你敲的字发过去,把主机回的字显示出来。后来人们把这种设备叫哑终端(dumb terminal)——「哑」的意思就是它很笨,聪明全在主机那边。
最早的「屏幕」是纸
最早的终端连屏幕都没有。它是一台改装过的电传打字机(teletype,缩写 TTY)——本来是邮局用来发电报的机器:你在这头敲字,千里之外的另一台机器就把字打在纸上。工程师把它接到计算机上:键盘敲的字符顺着电线送进主机,主机算完,把结果一个一个字符发回来,打字机的打印头就哒哒哒地把结果打在纸上。
所以早期用电脑的真实画面是:你敲一行命令,等几秒,纸带上打出一行结果。纸越堆越高,那就是你的「屏幕」,还能往回翻——物理意义上的翻。
这台机器对今天的深远影响,怎么强调都不过分。因为你的 Mac 上那个黑窗口,骨子里还在假装自己是一台 1963 年的电传打字机。
打字机留下的活化石
不信?随便开一个终端,敲 tty 这个命令,它会告诉你当前终端的设备文件,比如 /dev/ttys003。TTY 就是 teletype 的缩写——六十多年了,Linux 和 macOS 的内核里,管终端的那层代码仍然叫 tty。
再比如这些你多半遇到过、却未必想过来历的事:
- 为什么换行是两个动作?打字机上「到下一行」需要两步:回车(carriage return,CR)是把打印头推回行首,换行(line feed,LF)是把纸往上卷一行。这两个动作变成了两个控制字符,直到今天还在折磨程序员——Windows 文件用 CR+LF 两个字符表示换行,Unix 只用一个 LF,这就是无数「文件在另一系统打开全乱了」事故的源头。
- 为什么终端默认 80 列宽?因为 1928 年 IBM 的打孔卡一张打 80 列,后来的电传打字机和屏幕终端沿用了这个宽度,于是今天你的终端窗口一打开还是 80×24。
- 为什么按了 Ctrl-S 终端像死了一样?那是电传打字机时代的流控:纸打不过来的时候,终端发个 XOFF 信号(就是 Ctrl-S)让主机「停停,我跟不上了」,缓过来再发 XON(Ctrl-Q)继续。今天没有打印头了,但软件把这套手势原封不动继承下来——所以「卡死」的终端按一下 Ctrl-Q 往往就复活了。
- 为什么报错信息里会出现 typewriter?Unix 有个错误码叫 ENOTTY,老系统里它的字面意思是 "not a typewriter"(不是打字机)——程序想对终端做打字机特有的操作,结果发现对面根本不是终端,就报这个错。
从纸到玻璃,只是换了个「打印头」
1970 年代,纸换成了荧光屏,出现了「玻璃打字机」——其中最有名的是 DEC 公司的 VT100(1978 年)。它用电子束在屏幕上「打印」字符,行为上仍然模仿打字机:字符从左到右、从上到下,写满一行就换行,写满一屏就往上滚。
但屏幕毕竟比纸灵活:可以把光标挪到任意位置、清掉整行、让字变粗变亮。主机怎么告诉终端干这些事?用一串特殊的、不会显示出来的「指令字节」——这就是第四章要讲的转义序列,VT100 定的这套暗号后来成了行业标准,你今天终端里的颜色、进度条、vim 的整个界面,全靠这套四十多年前的暗号。
硬件死了,幽灵活着
1980 年代以后,个人电脑普及,一台机器自己就有键盘和显示器,不再需要分时的哑终端,硬件终端逐渐绝迹。但奇妙的事情发生了:硬件死了,协议活着。
今天你打开 iTerm2,它做的第一件事就是在操作系统里申请一对「假终端」设备(第七章详谈),然后认认真真地扮演一台 VT100:内核以为自己在和打字机说话,程序以为自己连着 VT100,而 iTerm2 在窗口里用显卡把这一切画出来。你在 Linux 服务器上敲 ls --color 看到的彩色文件名,是程序发出的 VT100 暗号;你按 Ctrl-S 屏幕停住,是电传打字机的流控手势。
一句话总结这一章:终端不是「那个黑窗口」,而是一套从电传打字机时代传下来的规矩——键盘出字节、屏幕收字节、中间一根线。今天所有的终端软件,都是这套老规矩的新演员。
那么这套规矩的核心——「中间那根线上跑的到底是什么」——就是下一章的事。剧透一下:只有字节,没有别的。