加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Bash subshel??l errexit语义

发布时间:2020-12-16 01:33:22 所属栏目:安全 来源:网络整理
导读:我为我的 shell脚本启用了errexit(和pipefail),因为这是我通常想要的行为.但是,偶尔我想捕获错误并以特定方式处理它们. 我知道对包含布尔运算符的命令禁用errexit或者将其用作条件(如果,等等) 例如 git push trueecho "Pushed: $?" 将在成功时回应“推动:0
我为我的 shell脚本启用了errexit(和pipefail),因为这是我通常想要的行为.但是,偶尔我想捕获错误并以特定方式处理它们.

我知道对包含布尔运算符的命令禁用errexit或者将其用作条件(如果,等等)

例如

git push && true
echo "Pushed: $?"

将在成功时回应“推动:0”,或者在失败时回应“推动:别的”.

但是,如果我想让子shell启用errexit,那么我希望捕获此子shell的退出代码?

例如:

#!/usr/bin/env bash
set -o errexit

(
    git push
    echo "Hai"
) && true

echo "Did it work: $?"

问题是,bash看到&& boolean运算符并禁用子shell的errexit.这意味着“海”总是回声.那是不可取的.

如何在这个子shell中启用errexit,并捕获子shell的状态代码,而不让出口代码终止外壳而不必在整个地方不断启用和禁用errexit?

更新

我有一种强烈的感觉,解决方案是使用陷阱并捕获退出信号.在我自我回答之前,请随意提供答案.

看来我偶然发现许多贝壳爱好者争论不休:

http://austingroupbugs.net/view.php?id=537#bugnotes

基本上,标准说了些什么,解释器忽略了它,因为标准似乎不合逻辑,但现在像Bash这样的解释器确实令人困惑的语义,没有人想要解决它.

不幸的是,陷阱< blah> EXIT不能用于做我想要的事情,因为陷阱基本上只是信号的中断处理程序,没有办法在预定的点继续执行脚本(就像你在try..finally块中使用一样)其他语言).

一切都很糟糕

基本上,据我所知,绝对没有理智的方法来执行错误处理.你的选择是:

#!/usr/bin/env bash
set -e

# Some other code

set +e
(
    git push || exit $?
    echo "Hai"
)
echo "Did it work: $?"
set -e

要么:

#!/usr/bin/env bash
set -e

(
    git push &&
    echo "Hai" ||
    exit $?
) && true

echo "Did it work: $?"

有点让你想知道为什么你首先打扰set -e!

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读