bashshellerror-handlingexit

Automatic exit from Bash shell script on error


I've been writing some shell script and I would find it useful if there was the ability to halt the execution of said shell script if any of the commands failed. See below for an example:

#!/bin/bash

cd some_dir

./configure --some-flags

make

make install

So in this case, if the script can't change to the indicated directory, then it would certainly not want to do a ./configure afterwards if it fails.

Now I'm well aware that I could have an if check for each command (which I think is a hopeless solution), but is there a global setting to make the script exit if one of the commands fails?


Solution

  • Use the set -e builtin:

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

    Alternatively, you can pass -e on the command line:

    bash -e my_script.sh
    

    You can also disable this behavior with set +e.

    You may also want to employ all or some of the the -e -u -x and -o pipefail options like so:

    set -euxo pipefail
    

    -e exits on error, -u errors on undefined variables, -x prints commands before execution, and -o (for option) pipefail exits on command pipe failures. Some gotchas and workarounds are documented well here.

    (*) Note:

    The shell does not exit if the command that fails is part of the command list immediately following a while or until keyword, part of the test following the if or elif reserved words, part of any command executed in a && or || list except the command following the final && or ||, any command in a pipeline but the last, or if the command's return value is being inverted with !

    (from man bash)