错误传播在 Bash 中不起作用

错误传播在 Bash 中不起作用

我有一个如下的脚本......

顶部有一些函数定义,其中之一是......

function err_out    
{

 trap 'echo "ERROR in $STEP function. EXITING!";exit 1' ERR    
 #some more messages

 exit 1
}

# Main program starts here
trap 'err_out' ERR

#do something
#call some functions
#call cleanup function
#end of script

当函数中发生某些错误时,这些错误不会被传播,也不会调用 err_out 函数。

我试过/bin/bash -E #!这样,当出现错误时,脚本就会退出,但我需要的是将错误正确传播到处理程序。

答案1

bash信息页面:

函数和其调用者之间的 shell 执行环境的所有其他方面都相同,但有以下例外:除非使用内置命令为函数赋予了属性,或者 通过内置命令启用了选项,否则不会继承DEBUG 和陷阱(在这种情况下,所有函数都会继承和陷阱),并且除非启用了 shell 选项,否则不会继承陷阱。RETURNtracedeclare-o functracesetDEBUGRETURNERR-o errtrace

因此您需要set -o errtrace在脚本的顶部将ERR陷阱传播到您的函数中。

此外,您需要小心ERR中的递归陷阱err_out。您真的想在错误处理程序中设置新陷阱,还是想显示该消息?如果是后者,那就echo这样吧;trap只有当您的错误处理程序中发生错误时才会调用 。

相关内容