存取 su -m $USER -c " 之外的退出代碼」

存取 su -m $USER -c " 之外的退出代碼」

下面的命令根據失敗與否正確列印“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 $?

我不確定為什麼當您在單行中請求返回程式碼時,返回程式碼不可用,但當您使用多行來做同一件事時,它是可用的。

相關內容