redirect到/ dev / null和简单closuresstream之间的有效区别是什么?

背景:
我想在一个受限制的bash的修改环境中testing一些bash脚本。 在受限制的bash中,我不允许将streamredirect到文件,例如2>/dev/null
我find了一个解决方法,只需closures与例如2>&-

虽然在这里和那里我发现2>/dev/null2>&-之间没有有效的区别2>&-
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里面的处理是不同的,但这对我并不重要。 对我来说重要的是,一般的closures而不是redirect到/ dev / null会导致什么问题?

这取决于程序在做什么。

如果关闭(2) 文件描述符 ,则将来的打开(2)将重新使用相同的文件描述符。 另外,未来写(2) (没有任何open )将失败与EINVAL

大多数程序不会检查printf(3)是否成功(理论上它们应该)。

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

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