根据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
/丢弃目的?
顺便说一句,其他差异 - 实际上主要是关于阅读- 我们有:
如果您使用的是 Linux,则永远不会“强制”重定向到
/dev/null
而不是/dev/zero
. 正如您所注意到的,无论哪种方式,您都会得到相同的结果。也就是说,
/dev/null
如果要丢弃数据,则应始终重定向到。因为每个人都明白写入/dev/null
意味着丢弃数据;它在表达你的意图。另一方面,写入
/dev/zero
也会丢掉你的数据,但是这并不是你正在尝试做的事情。除此之外,我会担心是否
/dev/zero
允许在其他 Unices 上写入,例如 BSD 等。我认为/dev/zero
POSIX 甚至不需要,而/dev/null
is . 因此,将/dev/null
其用于预期目的是最大的可移植性;做任何其他事情都是牺牲便携性而没有任何收获。有一个用例:如果一个程序检测到它的标准输出被定向到
/dev/null
并改变它的行为(在我看来这不是 Unix 方式),而你不希望这样。我只知道一个例子:
tar
. 想象一下,您想确保某个目录中的所有文件实际上都可以从磁盘读取(没有 I/O 错误等)。一种方法是让tar
他们/dev/null
:但是如果你尝试一下,你可能会发现它
tar
实际上并没有读取文件的内容,只有元数据(命令运行得太快了)。和确实读取了文件的内容(运行速度较慢,磁盘读取次数更多)。
没有强制用例,但有用例:
/dev/null:通常在您需要提供文件名但您不关心数据时使用。
这通常用于
stdout
:您不想要程序的输出,因此您将输出重定向到/dev/null
(因此它被丢弃)。在脚本(和 cronjob)上非常方便,您可以在其中检查状态,但文本只会混淆。您可以阅读
/dev/null
以创建一个空文件(但其他语法可能更好,例如: > empty_file_name
),或者当我只想要表的标题但我不想传递数据时/dev/zero:当我应该*物理地“擦除数据时,我会使用它,例如使用
dd
命令:我用零覆盖硬盘。零永远不会结束,因此它将覆盖所有硬盘,而没有原始文件(或占用空间)。交替使用它,/dev/random
但它会慢得多。我不记得我写信给
/dev/zero
(它似乎/dev/null
有一个更好的名字)。注意:
/dev/zero
将继续提供数据(并告诉程序它有数据)。/dev/null
相反(当用作输入时)只是告诉程序没有更多数据)。您链接的文档很有趣。如您所见
/dev/null
,通常用于写入和/dev/zero
读取(它与文档中列出的每个案例的第一种情况一致)。一般来说:当我们创建脚本时,我们可能会找到使用它们的新方法。这取决于我在做什么,以及特定程序需要哪些参数。当我们需要向程序提供许多确认时,我们也有
yes
命令y
(使用新行)为我们提供服务。