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


8

跑步

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;'

结果相同,但0根据则返回echo $?

我想了解这种差异,以便加深对Shell和可移植Shell编程的了解。

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

Answers:


20

&>不在POSIX中,也不支持dash。它解析为& >,因此该命令改为后台运行。从父级的角度来看,背景命令的退出状态为零,因为在您读取$?时它们尚未退出。

这也是为什么(至少对我来说)命令完成test1在提示中显示“ ”的原因。

Bash &> foo等效于> foo 2>&1,可移植脚本应使用后者。


5
&>在POSIX中。这是&其次>。在中foo &> bar,这是foo &foo后台开始的,> bar无需命令即可执行重定向。bash解释不同时,它不符合POSIX。
斯特凡Chazelas

4
足够有趣的是,它没有在wiki.ubuntu.com/DashAsBinSh中提及。 我自由编辑了页面,并添加了该内容
Sergiy Kolodyazhnyy
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.