下面的命令根據失敗與否正確列印“0”或“1”,因為我輸入了 $?在“su”命令內。
sudo su -m $USER -c "./shutdown.sh &> /dev/null; echo \$?"
但是,如果我這樣做:
sudo su -m $USER -c "$BASE/bin/shutdown.sh &> /dev/null"; echo $?
它總是印出“0”,因為實際的“su”總是會成功,即使命令部分失敗。
知道如何檢索子 shell 的退出程式碼嗎?
答案1
我剛剛修復了幾乎完全相同的情況。希望它仍然對您有幫助,如果沒有,也許還有其他人。我從 su 而不是 sudo 開始,但由於 sudo 旨在包裝單個其他命令,因此它確實應該中繼 su 的退出代碼。如果沒有,您也可以在 sudo 層級應用下面的修復。
正如您所指出的,主要問題是 su 成功執行了它的命令。預設操作是報告它已完成且沒有任何問題,因此返回退出代碼 0。因此,解決方案非常簡單,讓 su 返回最後一個命令的退出代碼。這為我做了
su <user_x> -c '<bunch_of_commands>; exit $?'
如果 sudo 不能很好地發揮作用,整個命令應該是這樣的(我會幫你檢查一下,但我沒有安裝 sudo)
sudo 'su <user_x> -c \'<bunch_of_commands>; exit $?\'; exit$?'
注意引號的嵌套並確保 $?不會被擴展,所以沒有雙引號。
答案2
回顯命令內部的返回值,並透過將整個命令分配給變數(使用子 shell)在外部存取它。
RETVAL=$(sudo su -m $USER -c "./shutdown.sh &> /dev/null; echo \$?")
echo $RETVAL
答案3
您始終可以使用 tmp 檔案:
$ sudo su -m $USER -c "$BASE/bin/shutdown.sh &> /dev/null; echo \$? > /tmp/exit_code"; cat /tmp/exit_code
答案4
這適用於 Zsh/Bash/Bourne shell:
$ sudo su -m $USER -c "$BASE/bin/shutdown.sh &> /dev/null"
$ echo $?
我不確定為什麼當您在單行中請求返回程式碼時,返回程式碼不可用,但當您使用多行來做同一件事時,它是可用的。