我正在使用以下选项
set -o pipefail
set -e
在bash脚本中停止执行错误。我有~100行脚本执行,我不想检查脚本中每行的返回码。
但对于一个特定的命令,我想忽略错误。我怎样才能做到这一点?
解决方案:
particular_script || true
例:
$ cat /tmp/1.sh
particular_script()
{
false
}
set -e
echo ein
particular_script || true
echo zwei
particular_script
echo drei
$ bash /tmp/1.sh
ein
zwei
drei
永远不会打印。
另外,我想补充一点,当pipefail
打开时,如果管道中的一个命令具有非零退出代码,那么shell就足以认为整个管道具有非零退出代码(pipefail
关闭它必须是最后一个一)。
$ set -o pipefail
$ false | true ; echo $?
1
$ set +o pipefail
$ false | true ; echo $?
0
只需在要忽略错误的命令后添加|| true
。
更简洁:
! particular_script
来自POSIX specification关于set -e
(强调我的):
启用此选项时,如果简单命令因Shell错误的后果中列出的任何原因而失败,或者返回退出状态值> 0,并且在while,until或if关键字后面不是复合列表的一部分,并且不是AND或OR列表的一部分,并且不是以!之前的管道!保留字,然后外壳应立即退出。
不要停止并保存退出状态
如果您希望脚本在特定命令失败时不停止并且您还想保存失败命令的错误代码,以防万一!
set -e
EXIT_CODE=0
command || EXIT_CODE=$?
echo $EXIT_CODE
您也可以使用“noop”或null实用程序(如POSIX specs中所述):
而不是“不执行任何操作”,而不是“返回true”。你会节省几封信。 :)
#!/usr/bin/env bash
set -e
man nonexistentghing || :
echo "It's ok.."
在使用CLI工具时我一直在使用下面的代码段,我想知道是否存在某些资源,但我不关心输出。
if [ -z "$(cat no_exist 2>&1 >/dev/null)" ]; then
echo "none exist actually exist!"
fi
虽然|| true
是首选,但你也可以
var=$(echo $(exit 1)) # it shouldn't fail
我有点喜欢这个解决方案:
: `particular_script`
执行后面滴答之间的命令/脚本,并将其输出馈送到命令“:”(相当于“true”)
$ false
$ echo $?
1
$ : `false`
$ echo $?
0
编辑:修复了丑陋的错字