BASH Unofficial Strict Mode

I recently discovered that a failed build deployed to production on a site I was working on. Here is a high level overview of the script.

#!/bin/bash
build
deploy

The issue here is that if build fails, then the script will still deploy then exit successfully (i.e. with an exit code of 0).

You can avoid this issue using Bash Unofficial Strict Mode. Here is the same script using Bash Unofficial Strict Mode

#!/bin/bash
set -euo pipefail
IFS=$'\n\t'

build
deploy

Let’s walk through the second and third lines.

Second Line

set -euo pipefail

Command by command

set -e

Exit immediately if any command has a non zero exit status

set -u

Exit immediately if referencing any variable that has not been previously defined

set -o pipefail

Prevent errors in a pipeline from being masked (e.g. if you are piping the results from command1 to command2 and there is an error when running command1 then the pipeline will exit with that error).

Third Line

IFS=$'\n\t'

In Bash, there is no string splitting function. You need to use IFS (Internal Field Separator) to control string splitting.

This will split on new lines rather than splitting on spaces in strings. This makes sense in a lot of cases but is not the default in Bash. The default value of IFS is: space, tab, newline.

;tldr

Save yourself a lot of headache and use Bash Unofficial Strict Mode by default.

References