“传统,但令人费解”:Unix 为什么会说“Not a typewriter”

给“MWichary”发的邮件退回一句“550 mwichary... User unknown: Not a typewriter”,曾是 1990 年代 Unix 用户的日常。Marcin Wichary 拆开这句话里叠着的四种缘由,也解释了打字机这个词为什么至今还藏在 ENOTTY 这个错误码里。

中文
复制
照片:一台灰色的控制台式打字机正面特写,键盘与宽字车在前,身后是成排带数字的旋钮开关,两侧是成列的指示灯

上世纪 90 年代,某些 Unix 操作系统的用户偶尔会碰到一个古怪的错误。它有时出现在你给某个可能之前已经发过邮件的人再发邮件的时候,而且除了错误本身让人摸不着头脑,提示信息也格外令人费解。

假设你想给“MWichary”发一封邮件。你收到的不是发送成功的确认,而是这个:

550 mwichary... User unknown: Not a typewriter

这个错误和许多离奇的错误一样,是四件事凑到一起的结果。

错误的根源很多人应该都熟悉——代码对大小写过于较真。在幕后,一个叫 sendmail 的软件一直默认用户名是小写的,这在早期确实成立。“MWichary”被悄悄改成了“mwichary”——一个并不存在的用户——程序如实报告了这个结果,却没有说明它的推理过程。

第二部分算是错误处理逻辑里的一种元错误。Sendmail 正确地返回了“User unknown”,但随后又条件反射地附上了系统错误值,想多提供一点调试线索。这些信息通常很有用,比如“Host is down”或“No space left of device”——我敢打赌,只要你在终端里干过一些大胆的事,就见过其中一些非常有辨识度的字符串。

但在眼下这个场景里,系统错误毫无用处。“Not a typewriter”的意思基本上是“这是一个在后台运行的程序,它不打算接受任何用户输入,也不打算输出任何供用户阅读的内容”。与其说是错误,不如说是一种状态,很多默默替操作系统干活的程序都处于这种状态。

可是……这条消息为什么要这么措辞?

纯粹是历史遗留。计算机最初确实把打字机当作输入/输出设备。有些打字机是本地设备,接在前置面板上,也就是控制台。另一些是远程打字机,即电传打字机,常简称为teletype,甚至tty。如果你认得这些词,那是因为它们今天还在用!

一台正面朝向的灰色控制台打字机:前景是其键盘和宽托架,其后是一块面板,上面排列着多列带编号的旋转开关,左右两侧各有多列指示灯,下方则有多组拨动开关。
一台 IBM 控制台打字机,配有蓝色按键和宽打印托架,机身呈白色和灰色,拍摄于博物馆展陈中;其后方,带有蓝色和橙色卷盘的磁带机立于玻璃之后。
一间陈列着 Bull General Electric 415 信息处理系统的博物馆房间:一张蓝银相间的控制台,倾斜面板上配有键盘,左侧桌上放着一台灰色小型打印机,后方是装有磁带机的蓝色机柜。

“这不是我能读写的输入/输出设备”会缩成一句干巴巴的“Not a typewriter”。在那个每个字符都显得昂贵、而打字机又是你唯一输入输出手段的年代,这并不难理解。后来,打字机被电传打字机、带屏幕的终端取代,最终又换成了 Terminal 和 Console 应用,这个字符串却只是多留了几十年。

第四块拼图是语法上的趣味:仅仅用冒号把两条消息连起来,就让人觉得用户本该是一台打字机。

这条消息最终还是改了名。今天再遇到它,它会说“Inappropriate ioctl for device”,我猜这算是进步。但它的代码仍然是 ENOTTY。

几十年后它很可能还叫这个名字,哪怕我们早已忘了打字机是什么。

本文标题出自 Solaris 操作系统手册里的解释。

来源: unsung.aresluna.org← 返回首页