根据FHS
关于/dev
:
它包含了:
The following devices must exist under /dev.
/dev/null
All data written to this device is discarded. A read from this device will return an EOF condition.
/dev/zero
This device is a source of zeroed out data. All data written to this device is discarded. A read from this device will return as many bytes containing the value zero as was requested.
...
观察两者都有:
All data written to this device is discarded
我读了很多教程,其中/dev/null
总是用来丢弃数据。但因为两者的写作目的相同(废弃)
问题
- 何时强制使用
/dev/zero
超过/dev/null
写/丢弃目的?
顺便说一句,其他差异 - 实际上主要是关于读- 我们有:
答案1
如果您使用的是 Linux,则永远不会“强制”重定向/dev/null
到/dev/zero
.正如您所注意到的,无论哪种方式,您都会得到相同的结果。
也就是说,/dev/null
如果您要丢弃数据,则应该始终重定向到。因为大家都明白,写入就/dev/null
意味着扔掉数据;它表达了你的意图。
另一方面,写入也会/dev/zero
丢弃您的数据,但您并不能立即看出这就是您想要做的事情。
除此之外,我会担心/dev/zero
其他 Unices 上是否允许写入,例如 BSD 等。我认为/dev/zero
POSIX 甚至不需要,而/dev/null
是。因此,用于/dev/null
其预期目的是最大限度地便携;做任何其他事情都是牺牲可移植性而没有任何好处。
答案2
有一个用例:如果一个程序检测到它的 stdout 被定向/dev/null
并改变了它的行为(在我看来,这不是很 Unix 方式),而你不希望这样。
我只知道一个例子:tar
。想象一下,您想要确保某个目录中的所有文件实际上都可以从磁盘读取(没有 I/O 错误等)。一种方法是让tar
他们/dev/null
:
tar -cv dir/ > /dev/null
但如果您尝试一下,您可能会发现tar
实际上并没有读取文件的内容,而是仅读取元数据(该命令运行得太快)。和
tar -cv dir/ > /dev/zero
确实读取文件的内容(运行速度较慢,磁盘读取次数较多)。
答案3
没有强制案例,但有用例:
/dev/空: 通常在需要提供文件名但不关心数据时使用。
通常这用于
stdout
:您不想要程序的输出,因此您将输出重定向到/dev/null
(因此它被丢弃)。在脚本(和 cronjob)上非常方便,您可以在其中检查状态,但文本只会造成混乱。您可以阅读
/dev/null
以创建一个空文件(但其他语法可能更好,例如: > empty_file_name
),或者当我只想要表的标题,但我不想传递数据时/dev/零:当我应该“物理”擦除数据时,我使用它,例如使用
dd
命令:我用零覆盖硬盘。零永远不会结束,因此它将覆盖所有硬盘,而不具有原始文件(或占用空间)替代它是使用/dev/random
但会慢很多。我不记得我写信给
/dev/zero
(它似乎/dev/null
有一个更好的名字)。
笔记:/dev/zero
将继续提供数据(并告诉程序它有数据)。/dev/null
相反(当用作输入时)只需告诉程序没有更多数据)。
您链接的文档很有趣。正如您所看到的,/dev/null
通常用于写入和/dev/zero
读取(它符合文档中列出的每个案例的第一种情况)。
一般来说:当我们创建脚本时,我们可能会找到使用它们的新方法。这取决于我在做什么,以及特定程序需要哪些参数。当我们需要向程序提供许多确认时,我们还有yes
命令(用新的一行)为我们提供命令。y