访问 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。它“不知道”命令的非 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 $?

我不确定为什么当您在一行中请求返回代码时它不可用,但是当您使用多行执行同一件事时它可用。

相关内容