¿Por qué se ignora la asignación de variables que precede al command?

Los estados de página de manual de bash 4.1 (énfasis agregado)

Comandos simples

Un command simple es una secuencia de asignaciones de variables opcionales seguidas de palabras y networkingirecciones separadas por espacios en blanco , y terminadas por un operador de control. La primera palabra especifica el command que se ejecutará y se pasa como argumento cero. Las palabras restantes se pasan como arguments al command invocado.

Verificando la versión en mi sistema (NO parcheada para shellshock)

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

Sin embargo, las asignaciones de variables anteriores, sin punto y coma, se supone que son una forma de localizar valores de variables de entorno durante la vida de esa única invocación de command, pero parece que no …

 # 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 

Solución
Según esta respuesta de otra pregunta , parece que el command debe usar deliberadamente las variables de entorno de su elemento primario y echo no. Pero invocaciones de shell como bash -c do …

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

Recursos

  • Esta respuesta dice que debería comportarse. Lo entiendo aunque no …
  • Esta puede ser la respuesta …

Esta línea

 x=123 echo $x 

se evalúa en el siguiente order:

  1. $x se amplía al valor de x en el shell actual .
  2. El valor de x en el entorno del command que se ejecutará se establece en 123
  3. La línea de command expandida se busca por un command y se encuentra echo .
  4. echo se ejecuta en un entorno donde x se establece en 123, y $1 se establece en el valor x tenga en el paso 1.
  5. echo produce $1 a la salida estándar, pero ignora los otros valores en su entorno.

Tenga en count que $x como argumento es independiente de la x que precede al command.