Skip to content
Ryan Delaney edited this page Dec 10, 2018 · 6 revisions

Declare and assign separately to avoid masking return values.

Problematic code in the case of export:

export foo="$(mycmd)"

Correct code:

export foo


In the original code, the return value of mycmd is ignored, and export will instead always return true. This may prevent conditionals, set -e and traps from working correctly.

When first marked for export and assigned separately, the return value of the assignment will be that of mycmd. This avoids the problem.


If you intend to ignore the return value of an assignment, you can either ignore this warning or use

foo=$(mycmd) || true
export foo

Shellcheck does not warn about export foo=bar because bar is a literal and not a command substitution with an independent return value. It also does not warn about local -r foo=$(cmd), where declaration and assignment must be in the same command.

Problematic code in the case of local:

local foo="$(mycmd)"

Correct code:

local foo

Problematic code in the case of readonly:

readonly foo="$(mycmd)"

Correct code:

readonly foo


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
You can’t perform that action at this time.