我使用以下选项
set -o pipefail
set -e
在bash脚本中停止执行错误。我有~100行脚本正在执行,我不想检查脚本中每一行的返回代码。
但是对于一个特定的命令,我想忽略这个错误。我该怎么做呢?
我使用以下选项
set -o pipefail
set -e
在bash脚本中停止执行错误。我有~100行脚本正在执行,我不想检查脚本中每一行的返回代码。
但是对于一个特定的命令,我想忽略这个错误。我该怎么做呢?
当前回答
虽然|| true是首选之一,但你也可以这样做
var=$(echo $(exit 1)) # it shouldn't fail
其他回答
我有点喜欢这个解决方案:
: `particular_script`
在反勾号之间执行命令/脚本,并将其输出提供给命令":"(相当于"true")。
$ false
$ echo $?
1
$ : `false`
$ echo $?
0
编辑:修正了丑陋的错别字
虽然|| true是首选之一,但你也可以这样做
var=$(echo $(exit 1)) # it shouldn't fail
在使用CLI工具时,我一直在使用下面的代码片段,我想知道是否存在一些资源,但我不关心输出。
if [ -z "$(cat no_exist 2>&1 >/dev/null)" ]; then
echo "none exist actually exist!"
fi
不要停止,也保存退出状态
以防万一,如果你想让你的脚本不停止,如果一个特定的命令失败,你也想保存失败命令的错误代码:
set -e
EXIT_CODE=0
command || EXIT_CODE=$?
echo $EXIT_CODE
我找到了另一种解决方法:
set +e
find "./csharp/Platform.$REPOSITORY_NAME/obj" -type f -iname "*.cs" -delete
find "./csharp/Platform.$REPOSITORY_NAME.Tests/obj" -type f -iname "*.cs" -delete
set -e
你可以通过set +e来关闭错误失败,这将忽略该行之后的所有错误。一旦完成,并且希望脚本在任何错误时再次失败,可以使用set -e。
应用set +e后,当找不到文件时,find不再使整个脚本失败。同时,错误消息 仍然打印From find,但整个脚本继续执行。因此,如果这导致了问题,则很容易进行调试。
这对CI和CD很有用(例如在GitHub Actions中)。