Kar*_*ter 8 shell bash dash subshell exit-status
跑步
bash -c 'bash -c "echo test1; exit 1;" &> /tmp/x; buildresult=$?; tail -n 100 /tmp/x; exit $buildresult;'
Run Code Online (Sandbox Code Playgroud)
结果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;'
Run Code Online (Sandbox Code Playgroud)
导致相同的输出,但0
根据返回echo $?
。
我想了解这种差异,以拓宽我对 shell 和可移植 shell 编程的理解。
我在 Ubuntu 17.10 (Artful Aardvark) 上使用bash
4.4.12 和dash
0.5.8-2.3ubuntu1。
Mic*_*mer 20
&>
不在 POSIX 中并且不受dash
. 它被解析为& >
,因此命令改为后台处理。从父级的角度来看,后台命令的退出状态为零,因为在您阅读 $? 时它们还没有退出。
这也是为什么(至少对我而言)在命令完成后,“ test1
” 输出出现在我的提示中。
Bash 的&> foo
等价于> foo 2>&1
,可移植的脚本应该使用后者。