“传统,但令人费解”: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。如果你认得这些词,那是因为它们今天还在用!



“这不是我能读写的输入/输出设备”会缩成一句干巴巴的“Not a typewriter”。在那个每个字符都显得昂贵、而打字机又是你唯一输入输出手段的年代,这并不难理解。后来,打字机被电传打字机、带屏幕的终端取代,最终又换成了 Terminal 和 Console 应用,这个字符串却只是多留了几十年。
第四块拼图是语法上的趣味:仅仅用冒号把两条消息连起来,就让人觉得用户本该是一台打字机。
这条消息最终还是改了名。今天再遇到它,它会说“Inappropriate ioctl for device”,我猜这算是进步。但它的代码仍然是 ENOTTY。
几十年后它很可能还叫这个名字,哪怕我们早已忘了打字机是什么。
本文标题出自 Solaris 操作系统手册里的解释。