在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确实是一个有效的文件。
我们现在来看一下关于/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