Linux 中的 /dev/null 是什么?

如果你深入研究 shell 编程,你会遇到 /dev/null 要么 2>/dev/null 无数次。 起初,这可能看起来像是令人生畏的抽象行话,但它的存在有一个非常重要(且易于理解)的原因。 在本文中,我们将了解 /dev/null 以及如何在 shell 编程中使用它。

什么是 /dev/?

在 Linux 上,从驱动程序到设备的所有内容都作为文件访问。 /dev/ 是一个包含所有物理和虚拟设备的目录。 例如, /dev/sda 可能是您的主硬盘和 /dev/sdb 可能是您现在正在使用的笔式驱动器的文件。

这就是您在 Linux 中访问设备的方式。 除了像硬盘这样的物理设备,Linux 还有虚拟设备。

虚拟设备是类似于物理设备但实际上仅以软件形式存在的设备。 应用程序可以从这些设备获取数据,但这些数据不是来自物理设备,而是来自操作系统本身。

什么是 /dev/null?

/dev/null 是一个特殊的虚拟设备,用于写入而不是读取。 写入 /dev/null 的任何内容都会从操作系统中消失。 正因为如此, /dev/null 被称为 比特桶.

比如这里我把echo的输出重定向到/dev/null。 如您所见,没有输出。 输出“Hello World”不存储在系统上的任何文件中。 它只是消失了。

但是你为什么要使用这样的东西呢? 我们来看看使用 /dev/null.

/dev/null 的使用

Linux 命令行被系统管理员甚至临时用户使用。 这些任务可以像启动 Firefox 一样简单,也可以像修复 systemd 问题一样乏味。

修复任何类型的问题都需要阅读大量日志,无论是系统日志、启动日志、服务器日志等。您将看到 /dev/null 被使用的最大方式是从整个输出中丢弃标准输出或标准错误。

什么是标准输出和标准错误?

每当您运行任何命令时,都会生成两个输出流,即标准输出 (stdout) 和标准错误 (stderr)。 标准输出是程序正常生成的任何输出。 标准错误包含命令生成的所有错误。

stdout 和 stderr 流可以分别由它们的文件描述符 1 和 2 访问。

例如,以下命令在 output.txt 中输出标准输出,在 error.txt 中输出标准错误。

如何将 /dev/null 与 stdout 和 stderr 一起使用?

如果您只想查看错误或仅查看没有错误的标准输出消息,您可以将一个流重定向到一个随机文本文件,就像我们在上面的示例中所做的那样。 但它会消耗内存和内存,而且大多是无用的数据。 这就是为什么我们将输出流重定向到 /dev/null.

例如,在这里我试图搜索 systemd 日志中的任何错误,即 journalctl 并通过将其重定向到忽略所有其他输出 /dev/null

Journalctl Dev Null

如您所见, journalctl 不会返回任何错误。

回到上一节中的 grep 示例。 如果我们只想要 grep 找到匹配项的消息而不是所有“权限被拒绝”错误语句怎么办。

使用开发空

做什么 > /dev/null 2>&1 意思是?

有时,没有任何输出对最终用户有用。 为此,我们将所有输出重定向到 /dev/null。 有两种方法可以做到这一点。 第一个也是最常用的是 $command >/dev/null 2>&1。 在这里,我们将 stdout 重定向到 /dev/null 被销毁,然后,我们还将 stderr 重定向到 stdout (2>&1)。 这样一来,任何输出都不会保留。

将所有输出重定向到 Null

在这里,我们不想要冗长的输出。 我们只是想看看 journalctl 是否返回任何错误。 echo $? 返回 0 表示最后一个命令运行没有错误。 如果它返回 2,则意味着最后一个命令运行时出错。

结论

在本文中,我们讨论了 /dev/null 的含义和用法。 我们看到了 /dev/null 在 Linux 中是一个 void,它吸收了给它的任何输入并且什么也不返回。 大多数情况下,管理员使用 if 来转储无用的数据,在其中输出,这样它就不会占用系统内存和处理能力。 您甚至可以通过将它们直接移动到 /dev/null/ 来删除无用的文件。 玩得开心,继续探索!