I have a Bash shell script that invokes a number of commands. I would like to have the shell script automatically exit with a return value of 1 if any of the commands return a non-zero value.
Is this possible without explicitly checking the result of each command?
dosomething1 if [[ $? -ne 0 ]]; then exit 1 fi dosomething2 if [[ $? -ne 0 ]]; then exit 1 fi
Add this to the beginning of the script:
This will cause the shell to exit immediately if a simple command exits with a nonzero exit value. A simple command is any command not part of an if, while, or until test, or part of an && or || list.
See the bash(1) man page on the "set" internal command for more details.
I personally start almost all shell scripts with "set -e". It's really annoying to have a script stubbornly continue when something fails in the middle and breaks assumptions for the rest of the script.
To add to the accepted answer:
Bear in mind that
set -e sometimes is not enough, specially if you have pipes.
For example, suppose you have this script
#!/bin/bash set -e ./configure > configure.log make
... which works as expected: an error in
configure aborts the execution.
Tomorrow you make a seemingly trivial change:
#!/bin/bash set -e ./configure | tee configure.log make
... and now it does not work. This is explained here, and a workaround (Bash only) is provided:
#!/bin/bash set -e set -o pipefail ./configure | tee configure.log make