在出错时自动退出bash shell脚本

我一直在编写一些shell脚本,如果有任何命令失败,就有能力暂停执行这个shell脚本,我会发现它很有用。 看下面的例子:

#!/bin/bash cd some_dir ./configure --some-flags make make install 

所以在这种情况下,如果脚本不能改变到指定的目录,那么如果失败,它肯定不会想要做一个./configure。

现在我很清楚,我可以为每个命令(我认为这是一个无望的解决scheme),如果检查,但有一个全局的设置,使脚本退出,如果其中一个命令失败?

使用set -e内build:

 #!/bin/bash set -e # Any subsequent(*) commands which fail will cause the shell script to exit immediately 

或者,您可以在命令行上传递-e

 bash -e my_script.sh 

您也可以使用set +e来禁用此行为。

(*) 注意:

如果失败的命令是命令列表的一部分,紧接着ifelif保留字,在&&||中执行的任何命令的一部分,紧接着一段时间直到关键字,shell不会退出。 列表,除了最后的&&||之后的命令 ,在pipe道中的任何命令,但最后,或者如果命令的返回值被反转

(从man bash

一旦其中一个命令失败,要立即退出脚本,请在开始处添加以下内容:

 set -e 

当一些不属于某个testing的命令(如if [ ... ]条件或&&构造中的命令)以非零退出代码退出时,会导致脚本立即退出。

这里是如何做到这一点:

 #!/bin/sh abort() { echo >&2 ' *************** *** ABORTED *** *************** ' echo "An error occurred. Exiting..." >&2 exit 1 } trap 'abort' 0 set -e # Add your script below.... # If an error occurs, the abort() function will be called. #---------------------------------------------------------- # ===> Your script goes here # Done! trap : 0 echo >&2 ' ************ *** DONE *** ************ ' 

一个成语是:

 cd some_dir && ./configure --some-flags && make && make install 

我意识到可以变长,但是对于更大的脚本,你可以把它分解成逻辑函数。

我认为你正在寻找的是trap命令:

 trap command signal [signal ...] 

有关更多信息,请参阅此页面 。

另一个select是在脚本的顶部使用set -e命令 – 如果有任何程序/命令返回非真值,将会使脚本退出。

第一行中可接受的答案的替代scheme:

 #!/bin/bash -e cd some_dir ./configure --some-flags make make install 

如果脚本内部调用下标, pipefail选项可能会有用。

 set -e set -o pipefail 

-e(errexit):当一个命令以非零状态退出时,第一个错误中止脚本(除非在until或while循环中,if-tests,list结构)

-o pipefail:使pipe道返回pipe道中返回非零返回值的最后一个命令的退出状态。

第三十三章选项