如何禁用 set -e 和 set -o

问题描述 投票:0回答:2

所以我把它放在 bash 脚本文件的开头(-e 和 -o)。 但是,在某些功能中,我希望它不要退出。示例

set -e
set -o pipefail

function check_status {
    echo "Start Check"
    docker exec mservice bash -c "echo 'Hello' | grep 'fail'"
    echo "End check"
}

check_status

如何防止它退出脚本 - 基本上,如果我运行它,它会打印出“开始检查”,但随后退出,因为下一个命令返回“1”。

我希望能够在多个位置或不同的功能中禁用和启用 set -e/-o。

bash unix
2个回答
54
投票

对于所有选项,

set -x
的相反是
set +x
(注意加号)。

因此

set +e
将撤消
set -e
,而
set +o pipefail
将撤消
set -o pipefail


3
投票

您也可以不理会设置,只需执行以下简单操作即可:

docker exec mservice bash -c "echo 'Hello' | grep 'fail'" || true

...这样做会强制成功运行该命令列表。在这种情况下,没有编程方法可以检测 docker 命令的失败,但如果该命令发出一些错误消息,人类观察者可能会注意到。

或者你可以在你的函数中处理错误

#!/usr/bin/env bash

set -e
set -o pipefail

function check_status {
    if docker exec mservice bash -c "echo 'Hello' | grep 'fail'"; then
        echo good
    else
        echo bad
    fi
}

status=$(check_status)

if [ "$status" = 'bad' ]; then
  echo "check_status failed, but still running, handling the error..."
fi

另存为

testfail.sh
并为我运行它会导致失败,因为我的 docker 安装不包含任何名为
mservice
:

$ ./testfail.sh 
Error response from daemon: No such container: mservice
check_status failed, but still running, handling the error...
$ 
© www.soinside.com 2019 - 2024. All rights reserved.