
我现在每天大概有一半的代码是跟 AI 一起写的。
不是玩具项目,是正经在跑的服务。AI 出初稿,我 review,改完合进去。
这个过程里我注意到一件事。AI 拼 shell 命令的时候,特别喜欢在后面接一句 2>/dev/null。有时候是 2>&1。不是随机的,不同场景它会选不同的写法。
这两句话长得像咒语,但其实一拆就懂。
先看 2>/dev/null。
这里面有三样东西。2 是一个编号,代表程序的「报错出口」。> 是重定向,就是「把东西送到别的地方去」。/dev/null 是目的地,一个系统自带的黑洞,什么东西进去都没了。
连起来读就是,把报错出口的内容,送进黑洞。翻译成人话,「这条命令可能会报错,但报错信息你不需要看,帮你扔了」。
那为什么是 2,不是 1,不是 3?
因为 Unix 给每个程序预留了三条通道。0 号是入口,接收输入。1 号是正门出口,正常结果从这儿出。2 号是侧门出口,报错和抱怨从这儿出。
所以 2>/dev/null 就是把侧门通向黑洞。正门不受影响,该输出什么还输出什么。

再看 2>&1。
这个 &1 的意思是「1 号通道当前指向的地方」。所以整句话是说,把 2 号通道也接到 1 号通道去,让报错和正常输出走同一条路。
为什么要这样?比如你想把一条命令的所有输出都存进日志,不管是正常结果还是报错,全要。那你就先写 >log.txt 把正门指向日志文件,再写 2>&1 让侧门也跟过去。
两种写法,两种态度。
2>/dev/null 是「这个错误不重要,扔了」。
2>&1 是「这个错误也重要,跟正常输出一起收好」。
AI 每次在这两种之间做选择,其实是在替你做一个工程判断。
搞清楚这些之后,我反而对另一件事产生了好奇。
我用了十几年 Linux,对 /dev/null 的理解一直就是「黑洞,扔东西用的」。够用,但从来没想过一个更有意思的问题。
凭什么操作系统里会有一个专门代表「虚无」的东西?
这不是一个实用问题。这是一个设计问题。
1969 年,Ken Thompson 在贝尔实验室搞 Unix 的时候,立了一条规矩。程序跟外界打交道,统一走文件描述符。不管对面是磁盘、终端、打印机还是另一个程序,接口都长一样。open,read,write,close,四个动作通吃一切。
这条规矩后来被总结成一句话,「一切皆文件」。
但这套逻辑走到底,会撞上一个问题。
如果键盘是文件,屏幕是文件,打印机是文件,那你当然可以用 > 把输出从屏幕切到文件,用 | 把一个程序的输出接到另一个程序的输入,全用同一套语法。
可有时候你就是不想要某个输出。你不能写 2>空气,shell 不认识空气。你也不能不写,不写它就打到屏幕上了。
Thompson 的解决方案很 Unix,既然一切皆文件,那就造一个代表「虚无」的文件。
你往里写什么,它假装收到了,实际直接扔掉。你从它读,它立刻告诉你「没了」。它在文件系统里有路径,有权限,跟普通文件一模一样,只是背后什么都没有。
这就是 /dev/null。
不是谁图方便顺手加的。是「一切皆文件」这条原则走到尽头的必然产物。你把世界上所有东西都抽象成文件,那「什么都没有」也得是个文件,否则你的抽象体系就缺了一块,在这个地方就会漏气。
你可以把它想成数学里的零。自然数可以没有零,数数够用。但你想做减法的时候就出问题了。零不是一个数量,是一个概念,「什么都没有」本身需要一个名字,不然没法参与运算。
/dev/null 就是文件系统的零。

想通这件事之后,一些以前觉得理所当然的东西突然清楚了。
比如 Linux 里每个后台服务启动的时候,都会把输入、输出、报错三条通道全部接到 /dev/null 上。
为什么?因为后台服务不需要跟任何人对话,但程序天生就带着这三条通道,你没法把它们摘掉。就像一个人可以不说话,但不能没有嘴。你只能给它一个「说了也没人听」的地方,让它安静地运行。/dev/null 就是那个地方。
在这个场景里,/dev/null 的角色不是黑洞,是安全网。
再比如 /dev 目录下 null 还有几个兄弟。/dev/zero 读出来全是 0,常用来给内存清零。/dev/full 写什么都告诉你「磁盘满了」,专门用来测程序在空间不够的时候会不会崩。/dev/urandom 吐随机数。
这几个全是操作系统虚构出来的,没有一个对应真实硬件,但每一个都解决了一个真实的工程问题。

这套设计 1969 年就定了。五十多年后,AI 从几十亿行代码语料里学出来的模式,还是 2>/dev/null 和 2>&1。
不是因为 AI 读过 Thompson 的论文。是因为这套接口太好用了,好用到在几十亿行代码样本里无处不在,任何统计模型都会自然收敛到它上面。
所以当我看到 AI 往命令后面接 2>/dev/null 的时候,感受跟以前不一样了。
以前觉得这是一句咒语,知道管用就行。
现在觉得这是五十多年前一个设计决定的回声。Thompson 他们在 8KB 内存的机器上做出了一套抽象,干净到半个世纪后,一个从来没见过那台机器的统计模型,写出来的代码里依然全是它的影子。
好的设计就是这样。你甚至不需要知道它的存在,但你每天都在用它。