2011-08-19 9 views
62

En Linux (Ubuntu 11.04) in bash, ¿es posible establecer temporalmente una variable de entorno que solo será diferente de la variable normal durante la duración del script? Por ejemplo, en un script de shell, crear una aplicación que se guarde en el dispositivo portátil HOME configurando HOME de manera temporal en una carpeta en el directorio de trabajo actual y luego iniciando la aplicación.¿Cómo establecer una variable de entorno solo para la duración del script?

+4

Sería más difícil si quería el ajuste a durar _beyond_ la duración de la secuencia de comandos – Nemo

Respuesta

15

sólo hay que poner

export HOME=/blah/whatever 

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

+3

Eso es engañosa. 'export' pasará 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 el script salga. – brightlancer

+0

@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 está más allá del nivel de sofisticación del OP y solo confundiría). –

+3

La exportación no es necesaria. Además, su respuesta solo funciona si su script invoca un intérprete (#!/Bin/sh o similar). Si su "guión" no funciona, entonces lo que le acaba de decir persistirá más allá del final de su guión. Es por eso que dije que su respuesta fue 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 la "exportación" es el elemento necesario que estaba buscando. – brightlancer

50
env VAR=value myScript args ... 
+13

O 'VAR = value myScript args ...' – Rockallite

+4

1. ¿Cómo es que 'PATH = $ PATH: XYZ echo $ PATH | grep XYZ' no tiene ninguna salida, sin embargo? 2. ¿Cuál es la diferencia entre usar y no usar 'env'? – qubodup

+9

porque el shell expande la variable PATH ** antes ** de ejecutar el comando echo. Debes retrasar esa expansión. Una forma: 'PATH = $ PATH: XYZ sh -c 'echo $ PATH' | grep XYZ' - las comillas simples son la clave aquí –

53
VAR1=value1 VAR2=value2 myScript args ... 
+1

Lo he hecho varias veces para ejecutar 'vblank_mode = 0 glxgears'. Funciona, pero también dice 'vblank_mode = 0: command not found' después de ejecutar, mientras que anteponer' env' no causa esto. [probando ...] Aparentemente a zsh no le gusta (y todavía lo usa correctamente), pero bash está bien con eso. Creo que iré con el método 'env' a partir de ahora. –

Cuestiones relacionadas