何时强制使用 /dev/zero 而不是 /dev/null 来进行写入/丢弃?

何时强制使用 /dev/zero 而不是 /dev/null 来进行写入/丢弃?

根据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/zeroPOSIX 甚至不需要,而/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

相关内容