错误传播在 bash 中不起作用

Bas*_*ser 2 linux bash shell-script

我有一个脚本,如下所示......

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

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
Run Code Online (Sandbox Code Playgroud)

当函数中发生一些错误时,它们不会传播,并且 err_out 函数不会被调用。

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

gee*_*aur 5

bash信息页面:

shell 执行环境的所有其他方面在函数及其调用者之间都是相同的,但有以下例外: 和DEBUG 陷阱RETURN不会被继承,除非已使用内置函数为该函数指定了trace属性,declare或者-o functrace 已使用内置函数启用了该选项set(其中如果所有函数都继承了DEBUGRETURNtraps),除非启用了 shell 选项,ERR否则不会继承 trap 。-o errtrace

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

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