如何在 bash 函数内部断言而不考虑逻辑检查?

如何在 bash 函数内部断言而不考虑逻辑检查?

我想为我的 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失败的任何逻辑(例如对 的调用)应该触发陷阱?fooreturn 0;

相关内容