Skip to content
koalaman edited this page Jan 20, 2018 · 6 revisions

This assignment is only seen by the forked process.

Problematic code:

name=World cmd -m "Hello $name"

Correct code:

export name=World
cmd -m "Hello $name"

To prevent setting the variable, this can also be done in a subshell:

(
   export name=World
   cmd -m "Hello $name"
) # 'name' does not leave this subshell

Rationale:

In name=World cmd "$name", name=World is passed in as part of the environment to cmd (i.e., in the envp parameter to execve(2)). This means that cmd and its children will see the parameter, but no other processes will.

However, "$name" is not expanded by cmd. "$name" is expanded by the shell before cmd is ever executed, and thus it will not use the new value.

The solution is to set the variable and export the variable first. If limited scope is desired, a ( subshell ) can be used.

Exceptions

In the strange and fabricated scenarios where the script and a program uses a variable name for two different purposes, you can ignore this message. This is hard to conceive, since scripts should use lowercase variable names specifically to avoid collisions with the environment.

Related resources:

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