当任何命令返回非零退出代码时,set -e 命令会使 bash 脚本立即失败。
是否有一种简单而优雅的方法来禁用脚本中单个命令的这种行为?
在 Bash 参考手册的哪些地方记录了此功能(http://www.gnu.org/software/bash/manual/bashref.html)?
答案1
像这样:
#!/usr/bin/env bash set -e echo hi # disable exitting on error temporarily set +e aoeuidhtn echo next line # bring it back set -e ao echo next line
跑步:
$ ./test.sh hi ./test.sh: line 7: aoeuidhtn: command not found next line ./test.sh: line 11: ao: command not found
set
内置帮助中对此进行了描述:$ type set set is a shell builtin $ help set (...) Using + rather than - causes these flags to be turned off.
这里也有同样的记录:https://www.gnu.org/software/bash/manual/bashref.html#The-Set-Builtin。
答案2
取消错误保释的另一种方法是无论如何都强制成功。你可以这样做:
cmd_to_run || true
这将返回 0(真),因此不应触发 set -e
答案3
如果您尝试捕获返回/错误代码(函数或分叉),则可以这样做:
function xyz {
return 2
}
xyz && RC=$? || RC=$?
答案4
我发现另一种方法相当简单(并且set
除了 之外还适用于其他选项-e
):
利用$-
恢复设置。
例如:
oldopt=$-
set +e
# now '-e' is definitely disabled.
# do some stuff...
# Restore things back to how they were
set -$oldopt
但具体来说-e
,其他人提到的选项(|| true
或“放在里面if
”)可能更符合惯用语。