繁体   English   中英

Bash ERR陷阱暂停程序

[英]Bash ERR trap halting program

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

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

返回

$ ./test.sh
begin
$ 

ERR陷阱仍然受外壳程序的errexit选项(设置-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所指的“错误”条件在功能上是相同的

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM