Take the 2-minute tour ×
Unix & Linux Stack Exchange is a question and answer site for users of Linux, FreeBSD and other Un*x-like operating systems.. It's 100% free, no registration required.

The bash 4.1 manpage states (emphasis added)...

Simple Commands

A simple command is a sequence of optional variable assignments followed by blank-separated words and redirections, and terminated by a control operator. The first word specifies the command to be executed, and is passed as argument zero. The remaining words are passed as arguments to the invoked command.

Verifying the version on my system (NOT patched for shellshock)...

#  bash --version
GNU bash, version 4.1.0(1)-release (i686-pc-linux-gnu) ...

However, preceding variable assignments, without semicolons, are supposed to be a way to localize environment variable values for the life of that one command invocation only, but do not seem to ...

#  x=123 echo $x; unset x; echo $x
bash: x: unbound variable
#  x=123; echo $x; unset x; echo $x
123
bash: x: unbound variable
#  x=123; echo $x | tr '1' 'a'; unset x; echo $x
a23
bash: x: unbound variable
#  x=123 echo $x | tr '1' 'a'; unset x; echo $x
bash: x: unbound variable
bash: x: unbound variable
#  x="123" echo "$x" | tr '1' 'a'; unset x; echo $x
bash: x: unbound variable
bash: x: unbound variable
#  x="123"; echo "$x" | tr '1' 'a'; unset x; echo $x
a23
bash: x: unbound variable

Solution
Per this answer from another question it appears that the command must deliberately use the environment variables of its parent and echo does not. But shell invocations like bash -c do ...

x=123 bash -c 'echo $x'; unset x; echo $x
123
bash: x: unbound variable

Resources

share|improve this question

marked as duplicate by peterph, Patrick, slm Oct 9 at 13:32

This question has been asked before and already has an answer. If those answers do not fully address your question, please ask a new question.

    
Because you are mixing two things - setting a variable in the environment of a command and expanding it by shell on the command line. See the same question with different wording: unix.stackexchange.com/questions/56444/…. –  peterph Oct 9 at 12:23
1  

1 Answer 1

This line

x=123 echo $x

is evaluated in the following order:

  1. $x is exapanded to the value of x in the current shell.
  2. The value of x in the environment of the command to be executed is set to 123
  3. The expanded command line is searched for a command, and echo is found.
  4. echo is run in an environment where x is set to 123, and $1 is set to whatever value x had in step 1.
  5. echo outputs $1 to standard output, but otherwise ignores the other values in its environment.

Note that $x as an argument is separate from the x that precedes the command.

share|improve this answer

Not the answer you're looking for? Browse other questions tagged or ask your own question.