【发布时间】:2015-04-09 07:55:41
【问题描述】:
我为我的 shell 脚本启用了 errexit(和 pipefail),因为这是我通常想要的行为。但是,有时我想捕获错误并以特定方式处理它们。
我知道对于包含布尔运算符或将用作条件(if、while 等)的命令禁用 errexit
例如
git push && true
echo "Pushed: $?"
成功时会回显“Pushed: 0”,失败时会回显“Pushed: something else”。
但是,如果我希望子 shell 启用 errexit,但又希望捕获此子 shell 的退出代码,该怎么办?
例如:
#!/usr/bin/env bash
set -o errexit
(
git push
echo "Hai"
) && true
echo "Did it work: $?"
问题是,bash 看到 && 布尔运算符并禁用子 shell 的 errexit。这意味着“海”总是被回响。这是不可取的。
如何在这个子 shell 中启用 errexit,并捕获子 shell 的状态代码,而不让该退出代码终止外壳 而不是不断地启用和禁用整个地方的 errexit?
更新
我有一种强烈的感觉,解决方案是使用陷阱并捕获退出信号。在我自行回答之前,请随时提供答案。
【问题讨论】:
-
我看不出
pipefail与这些有什么关系。您的脚本中没有管道。 -
也许你说的是
errexit? -
@Barmar 抱歉,我实际上是在谈论两者的结合。我的真实脚本确实包含子外壳内的管道。我会更新问题。
-
@Barmar 我已将问题更新为关于 errexit 而不是 pipefail(因为 pipefail 在这里无关紧要)。
-
@Barmar 您错误地编辑了我的问题。
set -e等价于set -o errexit。您有效地说 set errexit 两次。
标签: bash