如何禁用set -e和set -o

时间:2017-08-08 22:59:33

标签: bash unix

所以我在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

如何防止它退出脚本 - 基本上如果我运行它,它将打印输出“Start Check”,但随后退出,因为下一个命令返回'1'。

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

2 个答案:

答案 0 :(得分:4)

对于所有选项,set -的反面都是set +(请注意加号)。

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

答案 1 :(得分:0)

您也可以单独保留设置,并执行以下简单操作:

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...
$