以下命令根据失败与否正确打印“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。它“不知道”命令的非 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 $?
我不确定为什么当您在一行中请求返回代码时它不可用,但是当您使用多行执行同一件事时它可用。