(4 respuestas)
Cerrado hace 2 años.
Uno de mis compañeros de trabajo me proporcionó una sintaxis de Bash con la que no estoy familiarizado. Mi foo de Google me ha fallado al descubrir qué hace y por qué/cuándo debo usarlo.
El comando que me envió fue de esta forma:
someVariable=something
command
Inicialmente, pensé que esto era equivalente a lo siguiente:
someVariable=something ; command
O
someVariable=something
command
Pero esto no parece ser el caso. Ejemplos:
[Jan-03 11:26][~]$ # Look at the environment variable BAZ. It is currently empty
[Jan-03 11:26][~]$ echo $BAZ
[Jan-03 11:27][~]$ # Try running a command of the same format
[Jan-03 11:27][~]$ BAZ=jake echo $BAZ
[Jan-03 11:27][~]$
[Jan-03 11:27][~]$ # Now, echo BAZ again. It is still empty:
[Jan-03 11:27][~]$ echo $BAZ
[Jan-03 11:27][~]$
[Jan-03 11:28][~]$
[Jan-03 11:28][~]$ # If we add a semi-colon to the command, we get dramatically different results:
[Jan-03 11:28][~]$ BAZ=jake ; echo $BAZ
jake
[Jan-03 11:28][~]$
[Jan-03 11:28][~]$ # And we can see that the variable is actually set:
[Jan-03 11:29][~]$ echo $BAZ
jake
[Jan-03 11:29][~]$
¿Qué hace esta sintaxis? ¿Qué sucede con la variable que se ha establecido? ¿Por qué funciona esto?
Respuesta aceptada:
Esto es equivalente a:
( export someVariable=something; command )
Esto hace que someVariable
una variable de entorno, con el valor asignado, pero solo para el comando que se está ejecutando.
Aquí están las partes relevantes del bash
manuales:
Comandos simples
Un comando simple es una secuencia de asignaciones de variables opcionales seguido de palabras separadas por espacios en blanco y redirecciones, y terminado por un operador de control. La primera palabra especifica el comando a ejecutar y se pasa como argumento cero. Las palabras restantes se pasan como argumentos al comando invocado.
(…)
Expansión de comando simple
Si no resulta ningún nombre de comando [de la expansión del comando], las asignaciones de variables afectan el entorno de shell actual. De lo contrario, las variables se agregan al entorno del comando ejecutado y no afectan el entorno de shell actual .
Nota:tenga en cuenta que esto no es específico de bash
, pero especificado por POSIX.
Editar:discusión resumida de los comentarios en la respuesta
La razón BAZ=JAKE echo $BAZ
, no imprime JAKE es porque la sustitución de variables se realiza antes que nada. Si omite la sustitución de variables, esto se comporta como se esperaba:
$ echo_baz() { echo "[$BAZ]"; }
$ BAZ=Jake echo_baz
[Jake]
$ echo_baz
[]