¿Cómo establecer una variable de entorno solo durante la duración del script?

127

En Linux (Ubuntu 11.04) en bash, ¿es posible establecer temporalmente una variable de entorno que solo será diferente de la variable normal mientras dure el script? Por ejemplo, en un script de shell, hacer que una aplicación que se guarda en HOME sea portátil configurando temporalmente HOME en una carpeta en el directorio de trabajo actual y luego iniciando la aplicación.

suchipi
fuente
55
Sería más difícil si quisieras que la configuración dure más allá de la duración del guión
Nemo

Respuestas:

119
VAR1=value1 VAR2=value2 myScript args ...
Rockallita
fuente
2
Lo he hecho muchas veces para correr vblank_mode=0 glxgears. Funciona, pero también dice vblank_mode=0: command not founddespués de la ejecución, mientras que la preposición envno causa esto. [pruebas ...] Aparentemente, a zsh no le gusta (pero todavía lo usa correctamente), pero bash está bien con eso. Supongo que seguiré con el envmétodo de ahora en adelante.
Chinoto Vokro
2
con scripts funciona pero ¿qué VAR1="hello" echo $VAR1tal no devuelve nada?
Zibri
2
@Zibri se trata de cuándo está ocurriendo la expansión. Probablemente puedas hacer algo así:VAR1="hello" bash -c 'echo $VAR1'
cybergrind
Votado por mostrar que esto es posible incluso para múltiples variables de entorno.
Binarus
70
env VAR=value myScript args ...
Glenn Jackman
fuente
18
OVAR=value myScript args ...
Rockallite
9
1. ¿Cómo PATH=$PATH:XYZ echo $PATH | grep XYZes que no tiene salida? 2. ¿Cuál es la diferencia entre usar y no usar env?
Qubodup
18
porque el shell expande la variable PATH antes de ejecutar el comando echo. Necesitas retrasar esa expansión. Una forma: PATH=$PATH:XYZ sh -c 'echo $PATH' | grep XYZ- las comillas simples son la clave aquí
Glenn Jackman
14
¿Cuál es la diferencia entre usarlo envy no usarlo?
Mohammed Noureldin
Esto no parece funcionar en una línea comoIFS=$'\n' for l in lines; do ... done
drevicko
31

Sólo hay que poner

export HOME=/blah/whatever

en el punto del script donde desea que ocurra el cambio. Dado que cada proceso tiene su propio conjunto de variables de entorno, esta definición automáticamente dejará de tener importancia cuando el script finalice (y con ello la instancia de bash que tiene un entorno cambiado).

hmakholm dejó a Mónica
fuente
11
Eso es engañoso. exportpasará la variable a subcapas, pero no controla el shell primario. Si está escribiendo un script que comienza con "#! / Bin / sh" o similar, CUALQUIER variable que establezca desaparecerá cuando salga el script.
brightlancer
1
@brightlancer, eso es cierto pero no parece contradecir nada de lo que escribí. (Con la excepción de la posibilidad de que el script pueda iniciar un proceso en segundo plano, pero creo que eso está más allá del nivel de sofisticación del OP y solo confundiría).
hmakholm dejó a Mónica el
55
La exportación es innecesaria. Además, su respuesta solo funciona si su guión invoca a un intérprete (#! / Bin / sh o similar). Si su "guión" no lo hace, entonces lo que acaba de decirle persistirá más allá del final de su guión. Es por eso que dije que su respuesta era engañosa: podría ser correcta, podría no serlo, pero definitivamente tiene una parte que es innecesaria y confusa porque puede hacer que alguien piense que "exportar" es el elemento necesario que estaba buscando.
brightlancer
77
@brightlancer: La exportación es necesaria si el script del OP invoca sub-scripts que dependen de $ HOME, y no me atreví a asumir que ese no era el caso. Además, bash generará una subshell para ejecutar un script incluso si el script no tiene una línea shebang, sino que es solo un archivo de texto con el conjunto de bits de ejecución. Pruébelo: las asignaciones variables en el script no son visibles en el shell desde el que lo invoca. Es solo si explícitamente sourceel script que será ejecutado por el mismo shell en el que escribe el comando.
hmakholm dejó a Mónica el
44
@brightlancer: la exportación es necesaria si quiere $HOMEser heredado por algún comando ejecutado desde el script. Y si no lo hace, y la configuración de $HOMEes solo para beneficio del script en sí, entonces probablemente sería mejor modificar el script para que se refiera a algo diferente $HOME.
Keith Thompson