有没有办法让我的 bash 脚本中的函数在任何命令错误时自动运行?

tes*_*est 14 shell bash shell-script error-handling

我正在编写一个需要执行一堆命令的 shell 脚本,并且每个命令都依赖于之前的每个命令。如果任何命令失败,整个脚本都应该失败,我会调用退出函数。我可以检查每个命令的退出代码,但我想知道是否有我可以启用的模式或让 bash 自动执行此操作的方法。

例如,执行以下命令:

cd foo || myfunc
rm a || myfunc
cd bar || myfunc
rm b || myfunc
Run Code Online (Sandbox Code Playgroud)


有没有一种方法可以让我在执行这些命令之前以某种方式向 shell 发出信号,如果其中任何一个失败,它应该调用 myfunc,这样我就可以写一些更简洁的东西,例如:

cd foo
rm a
cd bar
rm b
Run Code Online (Sandbox Code Playgroud)

cuo*_*glm 16

如果任何命令返回大于零的状态并在退出时执行您的函数,您可以使用 bash trap ERR使您的脚本退出。

就像是:

myfunc() {
  echo 'Error raised. Exiting!'
}

trap 'myfunc' ERR

# file does not exist, causing error
ls asd
echo 123
Run Code Online (Sandbox Code Playgroud)

请注意,bash 陷阱 ERR确实隐式set -o errexitorset -e并且不是 POSIX。

并且ERR不执行陷阱,如果失败的命令是命令列表的一部分后立即untilwhile关键字,以下的测试的一部分ifelif保留字,命令的一部分执行&&||列表,或者命令的返回状态被倒置!.