2009-09-23 20 views
74

Come impostare una variabile di ambiente globale in uno script bash?Variabili di ambiente globali in uno script di shell

Se faccio cose come

#!/bin/bash 
FOO=bar 

... o

#!/bin/bash 
export FOO=bar 

... i vars sembrano rimanere nel contesto locale, mentre mi piacerebbe continuare a utilizzare loro dopo lo script ha terminato l'esecuzione.

risposta

121

eseguire lo script con .

. myscript.sh 

Questo verrà eseguito lo script nel contesto shell corrente.

export disciplina che saranno disponibili per nuovi processi variabili, quindi se tu dici

FOO=1 
export BAR=2 
./runScript.sh 

poi $BAR sarà disponibile nell'ambiente di runScript.sh, ma $FOO non lo faranno.

+24

Stai attento a quello primo. Senza una barra, guarderà sul tuo percorso: usa qualcosa del tipo '. ./myscript.sh 'se vuoi assicurarti che ne venga eseguito uno specifico. – paxdiablo

+1

Pensavo che il globale fosse GLOBALE !!! Questo cancella l'ultimo 1 ora di risoluzione dei problemi – Dennis

+8

'source' è un alias per' .'. Quindi potresti eseguire 'source myscript.sh', invece, se volessi essere più esplicito. –

-3
FOO=bar 
export FOO 
+2

Questo non funziona, non impostare la variabile di ambiente per il processo padre. – dreamlax

+3

Solo il processo padre può impostare una variabile di ambiente per il processo genitore. –

45

Quando si esegue il uno script di shell, viene eseguito in una sotto-shell in modo che non possa influenzare l'ambiente della shell madre. Si vuole risalire allo script facendo:

. ./setfoo.sh 

Questo esegue nel contesto della shell corrente , non come un sub shell .

Dalla pagina man di bash:

. nomefile [argomenti]
fonte nomefile [argomenti]

leggere ed eseguire comandi dal nomefile nell'ambiente corrente shell e forniscono lo stato di uscita dell'ultimo comando eseguito dal nome di file.

Se il nome file non contiene una barra, i nomi file in PATH vengono utilizzati per trovare la directory contenente il nome file.

Il file cercato in PATH non deve essere eseguibile. Quando bash non è in modalità POSIX, viene ricercata la directory corrente se non viene trovato alcun file in PATH.

Se l'opzione sourcepath per il comando incorporato shopt è disattivata, non viene eseguita la ricerca del PERCORSO.

Se vengono forniti argomenti, diventano i parametri posizionali quando il nome file viene eseguito.

Altrimenti i parametri posizionali sono invariati.Lo stato di ritorno è lo stato dell'ultimo comando terminato all'interno dello script (0 se non vengono eseguiti i comandi ) e false se il nome del file non viene trovato o non è possibile leggere .

+0

Interessante - Non ho visto prima quella sintassi. È equivalente alla fonte ./setfoo.sh? –

+2

È lo stesso, più veloce da digitare (e più compatibile sui sistemi precedenti - ksh non ha alcun comando di origine ma ha '.'). – paxdiablo

4
#!/bin/bash 
export FOO=bar 

o

#!/bin/bash 
FOO=bar 
export FOO 

uomo esportazione:

Il guscio dà l'attributo esportazione alle variabili corrispondenti ai nomi specificati, che ne causano loro di essere in ambiente di comandi eseguiti successivamente. Se il nome di una variabile è seguito da = word, il valore di tale variabile deve essere impostato su word.

+0

Per favore, ad ogni principiante nello scripting di shell: nota che non c'è spazio tra il nome di envvar, il carattere '=' e il valore stesso; questo non funzionerebbe: 'export FOO =/mydir/bar' – russellhoff

6

source myscript.sh è anche fattibile.

Descrizione per comando di Linux source:

source is a Unix command that evaluates the file following the command, 
as a list of commands, executed in the current context 
+0

Forse solo un po 'di più qui. Che ne dici di una breve descrizione di cosa 'fonte' fa? –

+0

@PhillipCloud digita 'man source' nel terminale e otterrai ciò che desideri. – CDT

+5

Ho familiarità con 'source'. Forse l'OP non lo è. –

Problemi correlati