sh 中的“&>>”在 Ubuntu 16.04.2 和 Fedora 24 中的行为不同

"&>>" in sh behaves differently in Ubuntu 16.04.2 and Fedora 24

考虑以下 sh 命令:

sh -c 'sleep 3 &>> /dev/null'

&>> 应该重定向 stdoutstderr。然而,它在 Fedora 24 和 Ubuntu 16.04.2.

中的解释不同

在Fedora 24中,正是这样工作的,上面的命令一直等到sleep结束。

在Ubuntu16.04.2中,命令运行方式与sleep 3 & >> /dev/null相同,即sleep发送到后台,命令立即退出。

差异会导致奇怪的问题,并且不容易找到,因为我在 R 脚本中调用了 foo arg1 arg2 output_file &>> test.log 之类的东西,并期望命令以 output_file 结尾。在 Fedora 24 中,它按预期工作,但令我惊讶的是 Ubuntu 16.04.2.

中的行为发生了变化

我不确定这是否是记录在案的行为。

最后的 link 解释了如何修复 dash(Ubuntu 中的 sh):

sh -c 'sleep 3 > /dev/null 2>&1'

这也适用于 Bash。请注意单个 > - 您不需要将追加运算符 (>>) 与 /dev/null.

一起使用

提示:看到这一点,您可能很想编写与 sh 的两种实现兼容的所有脚本,但这只会让您的生活变得不必要地困难。使用 强大的 shell,您可以期望它在您感兴趣的所有平台上默认可用。在您的情况下,这将是 bash(版本 4),这也是许多其他发行版的默认设置。