shell脚本中的trap exec返回代码

shell脚本中的trap exec返回代码,shell,error-handling,exec,Shell,Error Handling,Exec,我必须在shell脚本中使用exec运行一个命令,并且我需要在出现错误时捕获退出代码并运行另一个命令,例如 #!/bin/sh set +e exec command_that_will_fail if [ $? -eq 1 ]; then echo "command failed, running another command" fi 我知道exec替换了当前的shell并继续运行,我的问题是,如果exec未成功,我需要运行另一个命令。如果在尝试运行该进程时出现一些即时错误,您的代

我必须在shell脚本中使用exec运行一个命令,并且我需要在出现错误时捕获退出代码并运行另一个命令,例如

#!/bin/sh
set +e
exec command_that_will_fail
if [ $? -eq 1 ]; then
    echo "command failed, running another command"
fi

我知道exec替换了当前的shell并继续运行,我的问题是,如果exec未成功,我需要运行另一个命令。

如果在尝试运行该进程时出现一些即时错误,您的代码将正常工作:

$ echo 1
1
$ echo $?
0
$ exec asd123
-bash: exec: asd123: not found
$ echo $?
127
如果找到并启动了可执行文件,那么它将不会返回,因为它将超过整个脚本,并且再也不会返回bash

例如,这永远不会返回:

$ exec grep asd /dev/null
(grep的退出代码为1,但父shell被超越,因此没有人可以检查)


在这种情况下,如果您想从流程中获取退出代码,则必须将其作为子流程启动,即不使用exec(只需
命令\u将失败
)。在这种情况下,bash进程将充当一个主管,等待子进程完成并检查退出代码。

该命令必须使用exec,因为它位于docker入口点脚本中(我相信使用exec是为了在PID=1时继续),这更糟糕。通常,PID=1是init(根进程)。如果它死了,系统就死了,没有退出代码。为什么需要进程的PID=1?过程是什么?为什么您需要退出代码,您将如何处理它?此脚本作为docker容器的入口点运行。其想法是,如果出现问题,请尝试其他方法,但仍然运行container,但我仍然无法获得它。为什么bash脚本不能作为PID=1的入口点,您的实际进程可以是PID=222的子进程,如果它因错误而死亡,您将生成一个PID=333的替代方案?