为什么使用嵌套命令的存储返回码退出会导致 Dash 和 Bash 中的返回码不同?

为什么使用嵌套命令的存储返回码退出会导致 Dash 和 Bash 中的返回码不同?

跑步

bash -c 'bash -c "echo test1; exit 1;" &> /tmp/x; buildresult=$?; tail -n 100 /tmp/x; exit $buildresult;'

结果test1被打印到控制台并echo $?打印1,在我看来这是正确的,因为命令应该返回内部[b/d]ash -c返回的内容,而

dash -c 'dash -c "echo test1; exit 1;" &> /tmp/x; buildresult=$?; tail -n 100 /tmp/x; exit $buildresult;'

产生相同的输出,但返回 with0根据echo $?

我想了解这种差异,以拓宽我对 shell 和可移植 shell 编程的理解。

我在 Ubuntu 17.10 (Artful Aardvark) 上使用bash4.4.12 和0.5.8-2.3ubuntu1。dash

答案1

&>POSIX 中没有重定向并且不受dash.它被解析为& >,因此该命令改为后台运行。后台命令的退出状态为零从父母的角度来看,因为在您阅读时他们还没有退出$?

这也是为什么(至少对我来说)“ test1”输出出现在我的提示中,命令已完成。

Bash&> foo相当于> foo 2>&1,可移植脚本应该使用后者。

相关内容