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'
&>>
应该重定向 stdout
和 stderr
。然而,它在 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.
中的行为发生了变化
我不确定这是否是记录在案的行为。
sh
is not bash
.
Fedora 中的 sh
是 bash
,当作为 sh
调用时,它的行为是 "closely" 到 the POSIX standard。
sh
in Ubuntu is dash
.
&>>
is a bashism.
最后的 link 解释了如何修复 dash
(Ubuntu 中的 sh
):
sh -c 'sleep 3 > /dev/null 2>&1'
这也适用于 Bash。请注意单个 >
- 您不需要将追加运算符 (>>
) 与 /dev/null.
一起使用
提示:看到这一点,您可能很想编写与 sh
的两种实现兼容的所有脚本,但这只会让您的生活变得不必要地困难。使用 最 强大的 shell,您可以期望它在您感兴趣的所有平台上默认可用。在您的情况下,这将是 bash
(版本 4),这也是许多其他发行版的默认设置。
考虑以下 sh 命令:
sh -c 'sleep 3 &>> /dev/null'
&>>
应该重定向 stdout
和 stderr
。然而,它在 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.
我不确定这是否是记录在案的行为。
sh
is notbash
.
Fedora 中的 sh
是bash
,当作为sh
调用时,它的行为是 "closely" 到 the POSIX standard。sh
in Ubuntu isdash
.&>>
is a bashism.
最后的 link 解释了如何修复 dash
(Ubuntu 中的 sh
):
sh -c 'sleep 3 > /dev/null 2>&1'
这也适用于 Bash。请注意单个 >
- 您不需要将追加运算符 (>>
) 与 /dev/null.
提示:看到这一点,您可能很想编写与 sh
的两种实现兼容的所有脚本,但这只会让您的生活变得不必要地困难。使用 最 强大的 shell,您可以期望它在您感兴趣的所有平台上默认可用。在您的情况下,这将是 bash
(版本 4),这也是许多其他发行版的默认设置。