我使用以下选项

set -o pipefail
set -e

在bash脚本中停止执行错误。我有~100行脚本正在执行,我不想检查脚本中每一行的返回代码。

但是对于一个特定的命令,我想忽略这个错误。我该怎么做呢?


当前回答

我有点喜欢这个解决方案:

: `particular_script`

在反勾号之间执行命令/脚本,并将其输出提供给命令":"(相当于"true")。

$ false
$ echo $?
1
$ : `false`
$ echo $?
0

编辑:修正了丑陋的错别字

其他回答

在使用CLI工具时,我一直在使用下面的代码片段,我想知道是否存在一些资源,但我不关心输出。

if [ -z "$(cat no_exist 2>&1 >/dev/null)" ]; then
    echo "none exist actually exist!"
fi

解决方案:

particular_script || true

例子:

$ cat /tmp/1.sh
particular_script()
{
    false
}

set -e

echo one
particular_script || true
echo two
particular_script
echo three

$ bash /tmp/1.sh
one
two

第三部永远不会印刷。

另外,我想补充一点,当pipefail打开时, shell认为整个管道具有非零退出代码就足够了 当管道中的某个命令具有非零退出码(pipefail关闭时,它必须是最后一个)。

$ set -o pipefail
$ false | true ; echo $?
1
$ set +o pipefail
$ false | true ; echo $?
0

虽然|| true是首选之一,但你也可以这样做

var=$(echo $(exit 1)) # it shouldn't fail

不要停止,也保存退出状态

以防万一,如果你想让你的脚本不停止,如果一个特定的命令失败,你也想保存失败命令的错误代码:

set -e
EXIT_CODE=0
command || EXIT_CODE=$?
echo $EXIT_CODE

只需在希望忽略错误的命令后添加|| true。