如何禁用 set -e 和 set -o 命令

25

我在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个回答

53

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

因此,set +e 将撤消 set -eset +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...
$ 

谢谢,解决方案非常好。 - ibaralf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接