如何让 -e 在脚本中捕获脚本中的错误?

如何让 -e 在脚本中捕获脚本中的错误?

可以说我有apple.sh

set -e
...some commands #X...
./banana.sh
...more commands #Y..

进而banana.sh

set -e
...some commands #Z...

我的期望是,如果在 中的某处抛出错误banana.sh,那么这将以banana.sh错误状态退出,因此apple.sh也会看到错误并退出。我觉得我什至见过这种行为。但现在我发现这不是真的,虽然banana.sh在发生错误时按预期退出,apple.sh但从那里继续执行“一些命令#Y”的内容。

我怎样才能让错误banana冒出来并被捕获apple

这是在 RHEL5 上

答案1

这可能不是您的情况,但是您是否在被忽略的banana.sh特定上下文中调用?-e

Bash 参考手册您可以阅读有关此类上下文的详细说明,其中重要信息如下:

如果复合命令或 shell 函数在忽略 -e 的上下文中执行,则复合命令或函数体内执行的任何命令都不会受到 -e 设置的影响,即使设置了 -e 并且命令返回故障状态。如果复合命令或 shell 函数在忽略 -e 的上下文中执行时设置 -e,则在复合命令或包含函数调用的命令完成之前,该设置不会产生任何效果。

这意味着如果您有以下情况apple.sh

set -e

func() {
        echo '...some commands #X...'
        false # Suppose ./banana.sh fails here
        echo '...some commands #Y...'
        true
}

if func; then
        echo 'func() returns success'
else
        echo 'func() returns failure'
fi

您将得到以下输出:

...some commands #X...
...some commands #Y...
func() returns success

不仅 bash,包括 dash 和 zsh 在内的其他 shell 也会给出相同的结果。

为了回答你的问题,显然至少在 bash 上没有办法改变行为。

相关内容