在Linux中的/dev/null

在Linux中,/dev/null是一个空设备文件。写入到它的内容将被丢弃,并在读取时返回EOF。

这是一个命令行的黑客工具,它像吸尘器一样吸走所有扔向它的东西。

让我们来看看理解这意味着什么,以及我们能用这个文件做什么。


/dev/null 的属性

如果尝试使用cat命令读取它,它将返回一个文件结尾(EOF)字符。

cat /dev/null

这是一个有效的文件,可以通过验证进行确认。

stat /dev/null

这给我一个输出

  File: /dev/null
  Size: 0               Blocks: 0          IO Block: 4096   character special file
Device: 6h/6d   Inode: 5           Links: 1     Device type: 1,3
Access: (0666/crw-rw-rw-)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2020-02-04 13:00:43.112464814 +0530
Modify: 2020-02-04 13:00:43.112464814 +0530
Change: 2020-02-04 13:00:43.112464814 +0530

这表明该文件的大小为0字节,没有分配任何块。文件权限也设置为任何人都可以读写,但不能执行。

由于它不是一个可执行文件,我们无法使用|操作符进行重定向到/dev/null。唯一的方式是使用文件重定向符(>、>>、<、<<)。

下面的图表显示了/dev/null确实是一个有效的文件。

File Tables

我们现在来看一下关于/dev/null的一些常见用途。


在Linux中重定向到/dev/null。

我们可以通过重定向到/dev/null来丢弃脚本的任何输出。

例如,我们可以尝试使用这个技巧来丢弃回声信息。

echo 'Hello from JournalDev' > /dev/null

你将不会得到任何输出,因为它被丢弃了!

让我们试着以错误的方式运行一个命令,并将其输出导向 /dev/null。

cat --INCORRECT_OPTION > /dev/null

我们仍然会得到这样的输出:

cat: unrecognized option '--INCORRECT'
Try 'cat --help' for more information.

为什么会发生这种情况?这是因为错误消息来自标准错误(stderr),而我们只忽略了标准输出(stdout)的输出。

我们还需要考虑标准错误输出。

丢弃错误信息

让我们将 stderr 和 stdout 重定向到 /dev/null。我们可以使用 stderr 的文件描述符(=2)来实现。

cat --INCORRECT_OPTION > /dev/null 2>/dev/null

这将会给我们带来所需的东西!

有另一种方式可以做同样的事情;首先将stderr重定向到stdout,然后将stdout重定向到/dev/null。

这个的语法将是:

command > /dev/null 2>&1

请注意末尾的2>&1。我们将标准错误输出(2)重定向到标准输出(1)。我们使用& 1来告诉Shell目标文件是一个文件描述符而不是文件名。

cat --INCORRECT_OPTION > dev/null 2>&1

如果我们使用2>1,那么我们只会将stderr重定向到名为1的文件中。这不是我们想要的!


结论

希望这能够让你对Linux中的/dev/null有所了解,并且能够使用它!如果有任何问题,请在下面的评论区提问。


参考文献

  • StackOverflow Question

发表回复 0

Your email address will not be published. Required fields are marked *