猿问
下载APP

出错时自动退出bash shell脚本

我一直在编写一些shell脚本,如果能够在任何命令失败的情况下暂停执行所述shell脚本,我会发现它很有用。请参阅下面的示例:


#!/bin/bash  


cd some_dir  


./configure --some-flags  


make  


make install

因此,在这种情况下,如果脚本无法更改为指示的目录,那么如果失败,它肯定不会在之后执行./configure。


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


qq_笑_17
浏览 88回答 3
3回答

DIEA

使用set -e内置:#!/bin/bashset -e# Any subsequent(*) commands which fail will cause the shell script to exit immediately或者,您可以传递-e命令行:bash -e my_script.sh您也可以使用禁用此行为set +e。您可能还需要使用全部或部分的中-e -u -x和-o pipefail选项,如下所示:set -euxo pipefail-e退出时出错,-u未定义变量出错,-o (for option) pipefail退出命令管道故障。这里记录了一些问题和解决方法。(*) 注意:壳确实不退出如果失败的命令是紧跟在所述命令列表的一部分而或直到关键字,以下测试的一部分,如果或elif的保留字,在执行任何命令的一部分&&或|| 列表除了最后的&&或||之后的命令 ,管道中的任何命令,但是最后一个命令,或者命令的返回值是否被反转 !(来自man bash)

POPMUISE

要在其中一个命令失败后立即退出脚本,请在开头添加:set -e当某些不属于某些测试的命令(如在if [ ... ]条件或&&构造中)以非零退出代码退出时,这会导致脚本立即退出。

互换的青春

这是怎么做的:#!/bin/shabort(){    echo >&2 '****************** ABORTED ******************'    echo "An error occurred. Exiting..." >&2    exit 1}trap 'abort' 0set -e# Add your script below....# If an error occurs, the abort() function will be called.#----------------------------------------------------------# ===> Your script goes here# Done!trap : 0echo >&2 '*************** DONE *** ************'
打开App,查看更多内容
随时随地看视频慕课网APP
我要回答