可以说我有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 上没有办法改变行为。