Consideremos un ejemplo específico. El grep
comando usa una variable de entorno llamada GREP_OPTIONS
para establecer las opciones predeterminadas.
Ahora. Dado que el archivo test.txt
contiene las siguientes líneas:
line one
line two
ejecutar el comando grep one test.txt
volverá
line one
Si ejecuta grep con la -v
opción, devolverá las líneas no coincidentes, por lo que la salida será
line two
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.
GREP_OPTIONS='-v'
grep one test.txt
El resultado:
line one
Obviamente, la opción -v
no se pasó a grep
.
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
GREP_OPTIONS='-v' grep one test.txt
que devolverá lo esperado
line two
Utiliza este formulario para cambiar temporalmente el entorno de esta instancia particular del programa lanzado.
Exportar una variable hace que la variable se herede:
export GREP_OPTIONS='-v'
grep one test.txt
vuelve ahora
line two
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. Cuando env
se llama, suceden las siguientes cosas:
- El comando
env
se ejecuta como un nuevo proceso.
env
modifica el medio ambiente y
- llama al comando que se proporcionó como argumento. El
env
proceso es reemplazado por el command
proceso.
Ejemplo:
env GREP_OPTIONS='-v' grep one test.txt
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 ejecutar
GREP_OPTIONS='-v' grep one test.txt
Sin 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 la system()
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 la execvp()
función que busca a través de la PATH
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:
echo -e '#!/usr/bin/bash\n\necho I am an evil interpreter!' > python
chmod a+x ./python
export PATH=.
calibre
en lugar de lanzar Calibre, resultará en
I am an evil interpreter!
export key=value
es una sintaxis extendida y no debe usarse en scripts portátiles (es decir#! /bin/sh
).