首页 文章

出错时自动退出bash shell脚本

提问于
浏览
480

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

#!/bin/bash  

cd some_dir  

./configure --some-flags  

make  

make install

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

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

7 回答

  • 23

    我认为你要找的是 trap 命令:

    trap command signal [signal ...]
    

    有关更多信息,请参阅this page .

    另一种选择是在脚本顶部使用 set -e 命令 - 如果任何程序/命令返回非true值,它将使脚本退出 .

  • 755

    一个成语是:

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

    我意识到这可能会变长,但对于较大的脚本,您可以将其分解为逻辑功能 .

  • 17

    这是怎么做的:

    #!/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 *** 
    ************
    '
    
  • 43

    pipefail 结合使用 .

    set -e
    set -o pipefail
    

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

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

    Chapter 33. Options

  • 15

    要在其中一个命令失败后立即退出脚本,请在开头添加:

    set -e
    

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

  • 16

    使用set -e内置:

    #!/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 禁用此行为 .

    (*) 注意:

    如果失败的命令是紧跟在while或until关键字之后的命令列表的一部分,在if或elif保留字之后的测试的一部分,在&&或||中执行的任何命令的一部分,则shell不会退出列表除了最后的&&或||之后的命令,管道中的任何命令但是最后一个命令,或者命令的返回值是否被反转!

    (来自 man bash

  • 56

    适用于第一行的已接受答案的替代方案:

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

相关问题