Appearance
Errors in Shell Scripts
Errors or failures in shell are represented by a non-zero exit code between 1
and 255
. In most cases, exit code 1
can be used.
Resources:
Default Error Behaviors
By default, shell scripts will keep on running when encountered with an error (instead of terminating). See below:
bash
main () {
abc
def
}
main
# Output
# abc: command not found
# def: command not found
To be specific, it will not terminate when encountered with a non-zero exit code from a sub-command. It will still terminate when a non-zero exit code is emitted in the main flow:
bash
main () {
abc
def
exit 1
echo "Unreachable code"
}
main
# Output
# abc: command not found
# def: command not found
Terminate on Error
At the most basic level, we can get shell scripts to terminate when a subcommand errored, and propagate the exit code to the calling function. This can be done by adding set -e
in our script.
bash
set -e
main () {
abc
def
}
main
# Output
# abc: command not found
To cover most cases, it is common practice to add the following
bash
set -euo pipefail
set -u
This causes the shell script to treat unset variables as an error and exit immediately. See cases below:
bash
main () {
echo "$foo"
echo "end of main"
}
main
# Output
#
# end of main
bash
set -u
main () {
echo "$foo"
echo "end of main"
}
main
# Output
# line x: foo: unbound variable
set -o pipefail
This prevents errors from being silently ignored in pipelines. For example:
bash
cat example.txt | grep sometext | sort
By default, the exit status of the entire pipeline will just be that of the last command, sort. This can succeed even if example.txt does not exist and an earlier command like cat fails. pipefail changes this behaviour so that the pipeline is marked as failed if any of the commands fail. (Subsequent commands in the pipeline will still be executed. If multiple fail, the exit status of the last failing command will be used.)
Error Handling
https://stackoverflow.com/questions/64786/error-handling-in-bashhttps://stackoverflow.com/questions/30078281/raise-error-in-a-bash-script/50265513#50265513