Come impostare una variabile d'ambiente solo per la durata dello script?


127

Su Linux (Ubuntu 11.04) in bash, è possibile impostare temporaneamente una variabile d'ambiente che sarà diversa dalla variabile normale solo per la durata dello script? Ad esempio, in uno script di shell, rendere portatile un'app che salva in HOME impostando temporaneamente HOME in una cartella nella directory di lavoro attuale e quindi avviando l'app.


5
Sarebbe più difficile se volessi che l'ambientazione durasse oltre la durata della sceneggiatura
Nemo

Risposte:


120
VAR1=value1 VAR2=value2 myScript args ...

2
L'ho fatto molte volte per correre vblank_mode=0 glxgears. Funziona, ma dice anche vblank_mode=0: command not founddopo la corsa, mentre anteporre envnon lo causa. [test ...] Apparentemente a zsh non piace (eppure lo usa ancora correttamente), ma bash va bene con esso. Immagino che envda ora in poi seguirò il metodo.
Chinoto Vokro

2
con gli script funziona ma che ne dici di VAR1="hello" echo $VAR1non restituire nulla?
Zibri

2
@Zibri si tratta di quando sta avvenendo l'espansione. Probabilmente puoi fare qualcosa del genere:VAR1="hello" bash -c 'echo $VAR1'
cybergrind

Votato per aver dimostrato che ciò è possibile anche per più variabili di ambiente.
Binarus

70
env VAR=value myScript args ...

18
OppureVAR=value myScript args ...
Rockallite

9
1. Come PATH=$PATH:XYZ echo $PATH | grep XYZmai però non ha alcun output? 2. Qual è la differenza tra usare e non usare env?
qubodup

18
perché la shell espande la variabile PATH prima di eseguire il comando echo. Devi ritardare l'espansione. Solo andata: PATH=$PATH:XYZ sh -c 'echo $PATH' | grep XYZ- le virgolette singole sono la chiave qui
glenn jackman

14
Qual è la differenza tra usarlo enve non usarlo?
Mohammed Noureldin

Questo non sembra funzionare in un oneliner comeIFS=$'\n' for l in lines; do ... done
drevicko

31

Basta mettere

export HOME=/blah/whatever

nel punto dello script in cui desideri che avvenga il cambiamento. Poiché ogni processo ha il proprio insieme di variabili di ambiente, questa definizione cesserà automaticamente di avere alcun significato quando lo script termina (e con essa l'istanza di bash che ha un ambiente modificato).


11
È fuorviante. exportpasserà la variabile alle subshell, ma non controlla la shell genitrice. Se stai scrivendo uno script che inizia con "#! / Bin / sh" o qualcosa di simile, QUALSIASI variabile impostata scomparirà quando lo script esce.
brightlancer

1
@brightlancer, è vero ma non sembra contraddire nulla di ciò che ho scritto. (Con l'eccezione della possibilità che lo script possa avviare un processo in background, ma penso che vada oltre il livello di sofisticazione dell'OP e creerebbe solo confusione).
hmakholm ha lasciato Monica il

5
L'esportazione non è necessaria. Inoltre, la tua risposta funziona solo se il suo script richiama un interprete (#! / Bin / sh o simili). Se il suo "copione" non lo fa, ciò che gli hai appena detto persisterà oltre la fine del copione. Questo è il motivo per cui ho detto che la tua risposta era fuorviante: potrebbe essere corretta, potrebbe non esserlo, ma ha sicuramente una parte che non è necessaria e che crea confusione perché potrebbe indurre qualcuno a pensare che "esportazione" sia l'elemento necessario che stava cercando.
brightlancer

7
@brightlancer: l'esportazione è necessaria se lo script dell'OP richiama gli script secondari che a loro volta dipendono da $ HOME, e non ho osato presumere che non fosse così. Inoltre, bash genererà una subshell per eseguire uno script anche se lo script non ha una riga shebang ma è solo un file di testo con il bit di esecuzione impostato. Provalo: le assegnazioni di variabili nello script non sono visibili nella shell da cui lo invochi. È solo se esplicitamente sourcelo script verrà eseguito dalla stessa shell in cui digiti il ​​comando.
hmakholm ha lasciato Monica il

4
@brightlancer: l'esportazione è necessaria se vuole $HOMEessere ereditato da qualsiasi comando eseguito dallo script. E se non lo fa, e l'impostazione di $HOMEè solo a vantaggio della sceneggiatura stessa, allora probabilmente sarebbe meglio modificare la sceneggiatura in modo che si riferisca a qualcosa di diverso da $HOME.
Keith Thompson
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.