我在我的shell脚本中启用了errexit(和pipefail),因为这通常是我想要的行为。然而,偶尔我想捕获错误并以特定方式处理它们。
我知道对于包含布尔运算符或将用作条件(if、while等)的命令,errexit会被禁用。
例如:
git push && true
echo "Pushed: $?"
成功时将回显“Pushed: 0”,失败时将回显“Pushed: 其他内容”。
但是,如果我想要一个启用了 errexit 的子 shell,但是我又希望捕获这个子 shell 的退出代码怎么办?
例如:
#!/usr/bin/env bash
set -o errexit
(
git push
echo "Hai"
) && true
echo "Did it work: $?"
问题是,bash看到&&布尔运算符并禁用子shell的errexit。这意味着"Hai"总是会被echo出来。这是不可取的。
如何在此子shell中启用errexit,并捕获子shell的状态代码,而不让该退出代码终止外部shell,而无需在各处不断启用和禁用errexit?
更新
我强烈感觉解决方案是使用traps并捕获退出信号。在我进行自我回答之前,请随意提供答案。
errexit
? - Barmarset -e
等同于set -o errexit
。您实际上让它重复了设置errexit
。 - Benjamin Dobell