¿Por qué se ignora la asignación de variable que precede al comando?

¿Por qué se ignora la asignación de variable que precede al comando?

Los estados de la página de manual de bash 4.1(énfasis añadido)...

Comandos simples

Un comando simple esuna secuencia de asignaciones de variables opcionales seguidas de palabras separadas por espacios en blancoy redirecciones, y finalizados por un operador de control. La primerapalabraespecifica el comando que se ejecutará y se pasa como argumento cero. Las palabras restantes se pasan como argumentos al comando invocado.

Verificando la versión en mi sistema(NO parcheado para shock)...

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

Sin embargo, se supone que las asignaciones de variables anteriores, sin punto y coma, son una forma de localizar los valores de las variables de entorno solo durante la invocación de ese comando, pero no parecen...

#  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
Poresta respuesta de otra preguntaparece que el comando debe usar deliberadamente las variables de entorno de su padre y echono lo hace. Pero las invocaciones de shell como bash -cdo...

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

Recursos

Respuesta1

Esta línea

x=123 echo $x

se evalúa en el siguiente orden:

  1. $xse expande al valor de xen elactualcaparazón.
  2. El valor de xen el entorno del comando a ejecutar se establece en 123
  3. Se busca un comando en la línea de comando expandida y echose encuentra.
  4. echose ejecuta en un entorno donde xse establece en 123 y $1se establece en cualquier valor xque tuviera en el paso 1.
  5. echogenera $1la salida estándar, pero por lo demás ignora los demás valores en su entorno.

Tenga en cuenta que $xcomo argumento está separado del xque precede al comando.

información relacionada