Nic*_*ick 9 linux shell su exit-code
下面的命令根据失败与否正确打印“0”或“1”,因为我把 $? 在“su”命令中。
sudo su -m $USER -c "./shutdown.sh &> /dev/null; echo \$?"
Run Code Online (Sandbox Code Playgroud)
但是,如果我这样做:
sudo su -m $USER -c "$BASE/bin/shutdown.sh &> /dev/null"; echo $?
Run Code Online (Sandbox Code Playgroud)
它将始终打印“0”,因为即使命令部分失败,实际的“su”也将始终成功。
知道如何检索子外壳的退出代码吗?
小智 8
我刚刚修复了几乎完全相同的情况。希望它仍然可以帮助您,如果没有,那么也许其他人。我从 su 开始,而不是 sudo,但由于 sudo 旨在包装单个其他命令,因此它确实应该中继 su 的退出代码。如果没有,您也可以在 sudo 级别应用以下修复程序。
就像您提到的,主要问题是 su 成功执行了它的命令。然后默认操作是报告它没有任何问题地完成,因此它返回退出代码 0。它不“知道”来自命令的非 0 退出代码是意外的,或者它应该对它做些什么。因此,解决方案很简单,就是让 su 返回它最后一个命令的退出代码。这为我做到了
su <user_x> -c '<bunch_of_commands>; exit $?'
Run Code Online (Sandbox Code Playgroud)
如果 sudo 不能很好地发挥作用,整个命令应该是这样的(我会为你检查这个,但我没有安装 sudo)
sudo 'su <user_x> -c \'<bunch_of_commands>; exit $?\'; exit$?'
Run Code Online (Sandbox Code Playgroud)
注意引号的嵌套并确保 $? 不会被扩展,所以没有双引号。
您始终可以使用 tmp 文件:
$ sudo su -m $USER -c "$BASE/bin/shutdown.sh &> /dev/null; echo \$? > /tmp/exit_code"; cat /tmp/exit_code
Run Code Online (Sandbox Code Playgroud)