先别背命令。先做一个思想实验。
你坐在 Mac 前,打开 iTerm2,敲了一个字母 h。屏幕上出现了一个 h。看起来是同一个动作,对吧?
其实不是。真实发生的事是:你的按键先变成一个数字(104),被内核里一层继承自 1960 年代电传打字机的代码接住;它把 104 转交给一个叫 shell 的程序,shell 又顺手把 104 送回来显示;显示这一头,另一个程序在内存里维护着一张 80×24 的字符表格,把 104 填进某个格子,然后让显卡把整张表重画一遍——你才「看到」了那个 h。你敲的和显示的,是两趟旅行,中间隔着至少三个程序和一个坚持了六十年的老规矩。
再把这个 h 放到真实工作场景里:你 ssh 到千里之外的服务器,在 tmux 里敲下 h。这个数字要再穿过一次假终端、一次加密通道、一整根网线、服务器上的又一个假终端,才碰到远端的程序;显示回来的路上同样长途跋涉。一路上每一层都在假装自己是别的东西:软件假装硬件,假终端假装真终端,tmux 假装终端、又假装程序。
这本书讲的就是这一整条链:为什么叫终端(它是主机的神经末梢);线上跑的是什么(只有字节);谁在画屏幕(一张字符表格);颜色和光标哪来的(字节流里的暗号);shell 凭什么帮你补全(它把终端切成逐键模式手搓了一个编辑器);管道为什么能拼乐高(管子随便插拔);服务器怎么以为你有一台终端(内核撒的谎);SSH 怎么把按键飞过去;tmux 凭什么断线不死(它自己就是一台永不关机的假终端);Ctrl-C 到底杀了谁(信号)。
读完之后,「终端」对你来说不再是一个黑窗口加一堆要背的命令,而是一条你看得见每个关节的因果链——任何一环出问题(终端花了、管道断了、会话死了),你都知道该敲哪里。
我们从这台链条的源头开始:一台会打字的电报机。