我想为我的 bash 脚本实现一个全局陷阱,当出现任何问题时我会触发该陷阱。问题是,如果我有一个 if 子句正在评估作为谓词的函数,并且在评估该谓词时出现故障,则不会调用陷阱。我知道如果谓词返回 false,则不会调用陷阱,但我没想到计算谓词的逻辑也会禁用陷阱。我对行为的解释是否正确?是否有办法让 bash 调用逻辑计算谓词的陷阱?
例如,
$ trap 'echo $?' ERR
$ set -eE
$ foo() { return 1; }
$ bar() { foo; return 0; }
$ bar
1
到目前为止,一切都很好。我定义了一个陷阱,要求任何失败都会触发该陷阱,并要求所有函数都继承该陷阱。然后我调用bar
哪个调用foo
哪个失败,调用陷阱,并打印错误代码1
。
$ if bar; then echo true; fi
true
这是出乎意料的。我预计输出是1
.我预计只有返回代码bar
被排除在考虑范围之外。我认为,实际发生的情况是,里面的所有逻辑bar
都是还排除在考虑范围之外。这就是 bash 的工作方式吗?有没有办法指定在最后一个语句(例如 )之前bar
失败的任何逻辑(例如对 的调用)应该触发陷阱?foo
return 0;