“经典,却令人费解”
摘要
一篇回顾性博客文章,剖析 Unix 中著名的令人困惑的错误信息 “Not a typewriter”(ENOTTY),追溯其在 sendmail 的大小写敏感怪癖、errno 错误字符串以及电传打字机在操作系统设计中的历史遗留问题中的来龙去脉。
暂无内容
查看缓存全文
缓存时间: 2026/10/19 01:59
# “传统,却令人费解”——Unsung
来源:https://unsung.aresluna.org/traditional-but-puzzling/
在 1990 年代,某些基于 Unix 的操作系统的用户有时会遇到一个奇特的错误。当你给一个可能之前就发过邮件的人发送邮件时,偶尔就会发生这种情况。而且这个错误不仅令人困惑,消息本身更是匪夷所思。
假设你想给“MWichary”发送一封邮件。你看到的不是发送确认,而是这样一行:
`550 mwichary... User unknown: Not a typewriter`
和许多奇怪的错误一样,这个错误是四件不同事情交汇的结果。
错误的原因,很多人都会认得——代码对大小写过于较真。在幕后,一个叫做 sendmail 的软件总是假定用户名是小写的,这在早期确实是对的。“MWichary”被悄悄改成了“mwichary”——一个并不存在的用户——而程序报告的是字面结果,而不是它的推理链条。
第二部分是错误处理例程中的一种“元错误”。Sendmail 正确地报告了“User unknown”,但随后又条件反射式地附上了系统错误值所报告的内容,作为额外的调试信息。这些信息通常是有用的,比如“Host is down”(主机已停机)或“No space left of device”(设备空间不足)——我敢打赌,如果你曾在终端里做过什么大胆的事情,你一定见过这些非常独特的字符串(https://en.wikipedia.org/wiki/Errno.h)。
然而在这个特定的语境下,系统错误信息毫无用处。“Not a typewriter”(不是打字机)基本上意味着“这是一个在后台运行的程序;它不打算接受任何用户输入,也不打算为用户输出任何可读内容”。与其说这是一个错误,不如说这是一个*状态*,对于许多在后台默默执行操作系统指令的程序来说都是如此。
但是……为什么消息会是这样措辞的呢?
这只是历史遗留问题。计算机*最初*就是连接到打字机上进行输入输出的。其中一些打字机是本地的,连接在前面板上,即*控制台*(console)。另一些是远程打字机,即*电传打字机*(teleTypewriter),常被简称为 *teletype*,甚至直接叫 *tty*。如果你认得这些术语,那是因为它们至今仍在我们身边!
你就能明白,在一个每个字符都让人感觉代价高昂(https://unsung.aresluna.org/youd-get-knuckle-pain-if-you-typed-too-much/)、而打字机是输入输出唯一选择的时代,“这东西没有我能用的输入输出”是怎样变成一句简洁的“Not a typewriter”的。后来,这个字符串被保留了又几十年,即使打字机早已被电传打字机、带屏幕的终端,乃至最终的 Terminal 和 Console 应用程序所取代。
第四个部分是语法上的玩笑:仅仅因为两条消息用冒号连在了一起,就让人觉得用户应该是一台打字机。
这条消息*最终*被改名了。如果你今天遇到它,它会说“Inappropriate ioctl for device”(不适当的 ioctl 操作),我*猜*这算是个改进。但它的代码(https://en.wikipedia.org/wiki/Errno.h)仍然是 `ENOTTY`。
完全有可能,几十年后它依然叫这个名字,即便那时我们都已经忘记打字机是什么了。
这篇文章的标题来自 Solaris 操作系统手册(https://docs.oracle.com/cd/E19620-01/805-4036/msgs-1464/index.html)中的解释。
相似文章
Unix中的古怪注释和奇怪行为
丹尼斯·里奇讲述了早期Unix源代码中一些古怪的错误信息和注释,包括著名的“values of β will give rise to dom!”以及那句不可思议的注释“You are not expected to understand this.”
TTY 解密 (2008)
详细解释Linux和UNIX中的TTY子系统,涵盖从电传打字机到现代模拟终端的历史,以及线路规程的作用。
无法逃避:ANSI 转义码深度解析
技术探索 ANSI 转义码,追溯其 1970 年代终端起源,并探讨其在现代 CLI 工具和终端 UI 中的持久相关性。
花括号:Unix和C语言的演变
详细探讨了早期Unix系统在Teletype Model 33上如何输入花括号,涵盖了ASCII 1963、三字符组、双字符组以及终端驱动程序转换。
终端文本渲染的各种缺陷(2024)
本文探讨了终端模拟器中文本渲染的各种根本性问题,包括字符定义歧义、Unicode处理问题、有缺陷的二维网格假设以及光标不同步,凸显了支持复杂脚本和字体的困难。