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 echo
no lo hace. Pero las invocaciones de shell como bash -c
do...
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:
$x
se expande al valor dex
en elactualcaparazón.- El valor de
x
en el entorno del comando a ejecutar se establece en 123 - Se busca un comando en la línea de comando expandida y
echo
se encuentra. echo
se ejecuta en un entorno dondex
se establece en 123 y$1
se establece en cualquier valorx
que tuviera en el paso 1.echo
genera$1
la salida estándar, pero por lo demás ignora los demás valores en su entorno.
Tenga en cuenta que $x
como argumento está separado del x
que precede al comando.