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

Hac*_*chi 2 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
Run Code Online (Sandbox Code Playgroud)

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

Bas*_*tch 7

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

如果您关闭(2)一个文件描述符,那么未来的开放(2)将重新使用相同的文件描述符.此外,未来的写(2)(没有任何open)将失败EINVAL.

大多数程序都不打算检查例如printf(3)是否成功(理论上,它们应该).

如果成功重定向到/dev/null 写入(2)总是成功的.读取null(4).

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