Bash

為什麼使用嵌套命令的儲存返回碼退出會導致 Dash 和 Bash 中的返回碼不同?

  • November 19, 2017

跑步

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。

&>不在 POSIX 中且不受dash. 它被解析為& >,因此該命令是後台執行的。從父級的角度來看,後台命令的退出狀態為零,因為在您閱讀 $? 時它們還沒有退出。

這也是為什麼(至少對我而言)命令完成test1“ ”輸出出現在我的提示符中的原因。

Bash&> foo相當於> foo 2>&1,可移植腳本應該使用後者。

引用自:https://unix.stackexchange.com/questions/405475