1

这个陷阱ERR会停止脚本。其他示例表明可以使用陷阱来继续执行程序,那么为什么会停止呢?

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

退货

$ ./test.sh
begin
$ 
4

1 回答 1

2

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

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

返回

$ ./test.sh
begin
error
end
$ 

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

这将促使您作为开发人员非常防御性地编写。例如,您永远不能使用$?with,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 所指的“错误”条件在功能上是相同的

于 2014-06-18T08:38:57.707 回答