Recently I worked on a friend’s project and saw a script he uses to automate or reduce some part of the tedium in managing the project. I saw a line in his script that particularly caught my eye.

#!/bin/bash

set -euo pipefail # <--- 

What is this supposed to mean, I wondered. If this is important, I’ve been writing scripts the wrong way all this while, I wondered.

Here’s what I learned from a quick search about it. Committing this to this blog so that I can understand this in my own words.

What is set -euo pipefail

Overview: The command set -euo pipefail is used in bash scripts to improve error handling and make scripts more robust. Here’s what each options does:

  1. -e:

    Causes the script to immediately exit if any command in the script returns a non-zero exit status (indicating an error), except in certain scenarios like within if or while conditions. This helps prevent continuing with an invalid state.

  2. -u:

    Treats unset variables as errors and causes the script to exit immediately when attempting to use them. This helps catch issues where variables might be accidentally misspelled or forgotten.

  3. -o pipefail:

    Ensures that if any command in a pipeline fails (returns a non-zero exit status), the entire pipeline is considered failed, and the script exits. By default, Bash only uses the exit status of the last command in a pipeline, which can mask earlier errors.

Why set -euo pipefail

Using set -euo pipefail helps:

  • Catch errors early and prevent silent failures.
  • Enforce stricter error handling, making scripts more predictable.
  • Identify issues with unset variables and failed commands in pipelines.

Example:

#!/bin/bash
set -euo pipefail

# Example with an unset variable
echo "This will fail: $UNSET_VAR"

# Example with a pipeline
false | true  # Without pipefail, this would not trigger a failure.

Without set -euo pipefail, scripts might continue running despite errors, leading to unintended consequences.