跑步
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) 上使用bash
4.4.12 和0.5.8-2.3ubuntu1。dash
答案1
&>
POSIX 中没有重定向并且不受dash
.它被解析为& >
,因此该命令改为后台运行。后台命令的退出状态为零从父母的角度来看,因为在您阅读时他们还没有退出$?
。
这也是为什么(至少对我来说)“ test1
”输出出现在我的提示中,后命令已完成。
Bash&> foo
相当于> foo 2>&1
,可移植脚本应该使用后者。