重定向到/ dev / null和简单地关闭流之间的有效区别是什么

时间:2014-03-12 13:38:26

标签: linux bash io-redirection

背景:
我想在受限制的bash的修改环境中测试一些bash脚本。在受限制的bash中,我不允许将流重定向到文件,例如2>/dev/null
我通过简单地用例如关闭流来找到解决方法。 2>&-

在这里和那里尝试时,我发现2>/dev/null2>&-之间没有任何有效区别 STDERR输出被吞没,不会出现。

$ bash -c 'ls FOO'
ls: cannot access FOO: No such file or directory
$ bash -c 'ls FOO 2>/dev/null'
$ bash -rc 'ls FOO 2>/dev/null'
bash: /dev/null: restricted: cannot redirect output
$ bash -rc 'ls FOO 2>&-'
$ bash -rc 'ls FOO 2>&- ; ls BAR'
ls: cannot access BAR: No such file or directory

我猜bash中的处理方式不同但对我来说并不重要。对我来说重要的是,一般关闭而不是重定向到/ dev / null会导致任何问题吗?

1 个答案:

答案 0 :(得分:7)

这取决于程序正在做什么。

如果close(2)file descriptor,则未来open(2)会重复使用相同的文件描述符。此外,未来write(2)(没有任何open)将失败并显示EINVAL

大多数程序都不愿意检查是否例如printf(3)成功(理论上,他们应该)。

如果您成功重定向到/dev/null write(2),则总是成功。阅读null(4)

我建议尽可能重定向到/dev/null