"
set -e" 用于在命令(管道或子shell命令等)以非零状态退出时立即退出。
默认情况下,BASH会忽略错误并继续解释您的脚本。这可能会导致非常糟糕的意外结果,例如:
if ! lss myLock
then touch myLock; echo "No lock, I can do the job"; rm -f myLock
fi
这个脚本的结果是:
bash: lss : commande introuvable
No lock, I can do the job
正如您所看到的,BASH在未找到命令和命令执行失败之间没有区别。
“-e”经常用于确保Shell解释器在错误后立即停止(因此我们必须考虑所有错误...)。这有助于防止在脚本中犯错误时出现非常严重的问题(想象一下当您忘记设置v时执行rm -rf“$v” / *的情况;-))。为此,我们在
shebang中传递“-e”选项。显然,它不是为交互式使用而设计的,我也无法想象“set -e”或“set +e”的良好用法(但可以测试)。
回答您最初的问题。您可以通过应用以下解决方案之一来避免终止shell:
使用if语句
function myF1() {
if git foobar; then
echo "I will not print this, because git foobar returned a non-zero exit code"
fi
}
使用控制运算符 &&
function myF2() {
git foobar && \
echo "I will not print this, because git foobar returned a non-zero exit code"
}
打开一个子shell
function myF4() {(
set -e
git foobar
echo "I will not print this, because git foobar returned a non-zero exit code"
)}
在这种情况下,“set -e”将立即退出子shell,但不会终止调用者:-)
在这里使用陷阱不是一个好主意,因为它会对调用者产生副作用(陷阱被全局定义)。显然,我们可以结合陷阱和子shell,但在您的情况下没有用处。
set -e
?它是为脚本而设计的,不适合交互式使用。 - chepnerset -e
。将其添加到您希望在任何错误时退出的脚本的顶部,但不要将其添加到可能在交互式和非交互式 shell 中使用的特定函数中。 - chepner