De vez en cuando, elimino un script de bash y me parece que hay algunas formas de establecer una variable:
key=value
env key=value
export key=value
Cuando está dentro de un script o un comando único (por ejemplo, a menudo encadenaré una variable con un lanzador Wine para establecer el prefijo Wine correcto), estos parecen ser completamente intercambiables, pero seguramente ese no puede ser el caso.
¿Cuál es la diferencia entre estos tres métodos y puede darme un ejemplo de cuándo me gustaría usar cada uno específicamente?
Definitivamente relacionado con ¿Cuál es la diferencia entre `VAR = ...` y `export VAR = ...`? pero también quiero saber cómo env
encaja esto, y algunos ejemplos que muestran los beneficios de cada uno también serían buenos :)
command-line
bash
Oli
fuente
fuente
export key=value
es una sintaxis extendida y no debe usarse en scripts portátiles (es decir#! /bin/sh
).Respuestas:
Consideremos un ejemplo específico. El
grep
comando usa una variable de entorno llamadaGREP_OPTIONS
para establecer las opciones predeterminadas.Ahora. Dado que el archivo
test.txt
contiene las siguientes líneas:ejecutar el comando
grep one test.txt
volveráSi ejecuta grep con la
-v
opción, devolverá las líneas no coincidentes, por lo que la salida seráAhora intentaremos establecer la opción con una variable ambiental.
Las variables de entorno configuradas sin
export
no se heredarán en el entorno de los comandos que está llamando.El resultado:
Obviamente, la opción
-v
no se pasó agrep
.Desea usar este formulario cuando configura una variable solo para que la use el shell, por ejemplo
for i in * ; do
, si no desea exportar$i
.Sin embargo, la variable se pasa al entorno de esa línea de comando en particular, por lo que puede hacer
que devolverá lo esperado
Utiliza este formulario para cambiar temporalmente el entorno de esta instancia particular del programa lanzado.
Exportar una variable hace que la variable se herede:
vuelve ahora
Esta es la forma más común de establecer variables para el uso de procesos iniciados posteriormente en un shell
Todo esto se hizo en bash.
export
es un bash incorporado;VAR=whatever
es la sintaxis bash.env
, por otro lado, es un programa en sí mismo. Cuandoenv
se llama, suceden las siguientes cosas:env
se ejecuta como un nuevo proceso.env
modifica el medio ambiente yenv
proceso es reemplazado por elcommand
proceso.Ejemplo:
Este comando lanzará dos nuevos procesos: (i) env y (ii) grep (en realidad, el segundo proceso reemplazará al primero). Desde el punto de vista del
grep
proceso, el resultado es exactamente el mismo que ejecutarSin embargo, puede usar este idioma si está fuera de bash o no desea iniciar otro shell (por ejemplo, cuando está utilizando la
exec()
familia de funciones en lugar de lasystem()
llamada).Nota adicional sobre
#!/usr/bin/env
Esta es también la razón por la cual
#!/usr/bin/env interpreter
se usa el idioma en lugar de#!/usr/bin/interpreter
.env
no requiere una ruta completa a un programa, porque usa laexecvp()
función que busca a través de laPATH
variable como lo hace un shell, y luego se reemplaza por la ejecución del comando. Por lo tanto, se puede utilizar para averiguar dónde se "sienta" un intérprete (como perl o python) en el camino.También significa que al modificar la ruta actual puede influir en qué variante de Python se llamará. Esto hace posible lo siguiente:
en lugar de lanzar Calibre, resultará en
fuente
env
? Quiero decir, cuando abres un nuevo shell siempre tienes algunas variables. Así algún programa debe haberexport
ed aquellos, ¿verdad?set var=blah
?