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 envencaja esto, y algunos ejemplos que muestran los beneficios de cada uno también serían buenos :)
command-line
bash
Oli
fuente
fuente

export key=valuees una sintaxis extendida y no debe usarse en scripts portátiles (es decir#! /bin/sh).Respuestas:
Consideremos un ejemplo específico. El
grepcomando usa una variable de entorno llamadaGREP_OPTIONSpara establecer las opciones predeterminadas.Ahora. Dado que el archivo
test.txtcontiene las siguientes líneas:ejecutar el comando
grep one test.txtvolveráSi ejecuta grep con la
-vopció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
exportno se heredarán en el entorno de los comandos que está llamando.El resultado:
Obviamente, la opción
-vno 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.
exportes un bash incorporado;VAR=whateveres la sintaxis bash.env, por otro lado, es un programa en sí mismo. Cuandoenvse llama, suceden las siguientes cosas:envse ejecuta como un nuevo proceso.envmodifica el medio ambiente yenvproceso es reemplazado por elcommandproceso.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
grepproceso, 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/envEsta es también la razón por la cual
#!/usr/bin/env interpreterse usa el idioma en lugar de#!/usr/bin/interpreter.envno requiere una ruta completa a un programa, porque usa laexecvp()función que busca a través de laPATHvariable 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 haberexported aquellos, ¿verdad?set var=blah?