![错误传播在 Bash 中不起作用](https://linux22.com/image/1268641/%E9%94%99%E8%AF%AF%E4%BC%A0%E6%92%AD%E5%9C%A8%20Bash%20%E4%B8%AD%E4%B8%8D%E8%B5%B7%E4%BD%9C%E7%94%A8.png)
我有一个如下的脚本......
顶部有一些函数定义,其中之一是......
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 选项,否则不会继承陷阱。RETURN
trace
declare
-o functrace
set
DEBUG
RETURN
ERR
-o errtrace
因此您需要set -o errtrace
在脚本的顶部将ERR
陷阱传播到您的函数中。
此外,您需要小心ERR
中的递归陷阱err_out
。您真的想在错误处理程序中设置新陷阱,还是想显示该消息?如果是后者,那就echo
这样吧;trap
只有当您的错误处理程序中发生错误时才会调用 。