Bash ERR陷阱暂停程序

时间:2014-06-18 08:38:58

标签: bash bash-trap

ERR上的此陷阱会停止脚本。其他示例显示可以使用陷阱继续执行程序,为什么停止?

#!/bin/sh -e
trap 'echo error' ERR
echo begin
false
echo end

返回

$ ./test.sh
begin
$ 

1 个答案:

答案 0 :(得分:2)

ERR个陷阱仍受shell errexit选项(set -e)的影响。这里的问题是shebang设置errexit。这将按预期工作:

#!/bin/sh
trap 'echo error' ERR
echo begin
false
echo end

返回

$ ./test.sh
begin
error
end
$ 

errexit非常具有攻击性。如果任何语句不正确,它将立即终止脚本。

这会让你成为一名开发人员,非常防守。例如,您不能将$?errexit一起使用,因为如果退出代码非零,脚本本身将不会继续。这种“推动开发人员完善它”的方法对某些场景很有用,例如:通常,errexit用于在自动配置系统时运行非常早期的启动脚本。

如果您发现自己处于errexit方案但需要处理预期错误,则以下是常用方法:

#!/bin/sh -e 
trap 'echo error' ERR
echo begin
false || { echo "It was false"; } 
echo end

将输出:

begin
It was false
end

请注意,陷阱仍未触发,因为没有发生错误。据我所知,ERRtrap和errexit引用的“错误”条件功能相同