Skip to content
Vidar Holen edited this page Sep 5, 2021 · 1 revision

Bash implicitly disabled set -e for this function invocation because it's inside a command substitution. Add set -e; before it or enable inherit_errexit.

Problematic code:

#!/bin/bash

#shellcheck enable=check-set-e-suppressed
set -e

deploy() {
    make -j "$(nproc)" foo test
    cp ./foo /var/www/example.com/cgi-bin
    ./foo --version 2>&1
}

version=$(deploy)
echo "Successfully deployed $version"

Correct code:

#!/bin/bash

#shellcheck enable=check-set-e-suppressed
set -e
shopt -s inherit_errexit

deploy() {
    make -j "$(nproc)" foo test
    cp ./foo /var/www/example.com/cgi-bin
    ./foo --version 2>&1
}

version=$(deploy)
echo "Successfully deployed $version"

Rationale:

ShellCheck found a Bash function invoked in a command substitution with set -e enabled.

Unlike other shells, Bash disables set -e in command substitution by default. This means that the function will not exit on error.

In the problematic code, the hope was that the function (and therefore the script) would fail if the build and test suite failed. Instead, the deployment continues even if the tests fail.

This can be fixed by either using version=$(set -e; deploy) or by enabling inherit_errexit as in the correct example.

Exceptions:

If you don't care that the function runs without set -e, you can ignore this warning.

Related resources:

  • Help by adding links to BashFAQ, StackOverflow, man pages, POSIX, etc!

ShellCheck

Each individual ShellCheck warning has its own wiki page like SC1000. Use GitHub Wiki's "Pages" feature above to find a specific one, or see Checks.

Clone this wiki locally