在出错时自动退出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
来禁用此行为。
(*) 注意:
如果失败的命令是命令列表的一部分,紧接着if或elif保留字,在&&或||中执行的任何命令的一部分,紧接着一段时间或直到关键字,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道中返回非零返回值的最后一个命令的退出状态。
第三十三章选项