2011-12-22 31 views
28

Voglio utilizzare uno script di shell che posso chiamare per impostare alcune variabili di ambiente. Tuttavia, dopo l'esecuzione dello script, non vedo la variabile d'ambiente usando "printenv" in bash.L'impostazione della variabile di ambiente nello script di shell non lo rende visibile alla shell

Ecco il mio script:

#!/bin/bash 

echo "Hello!" 
export MYVAR=boubou 
echo "After setting MYVAR!" 

Quando faccio "./test.sh", vedo:

Hello! 
After setting MYVAR! 

Quando faccio "MYVAR printenv", non vedo nulla.

Puoi dirmi cosa sto facendo male?

risposta

49

Ecco come funzionano le variabili di ambiente. Ogni processo ha una copia dell'ambiente. Qualsiasi modifica apportata dal processo alla sua copia viene propagata ai figli del processo. Tuttavia, non si propagano al genitore del processo.

Un modo per aggirare il problema è quello di utilizzare il comando source:

source ./test.sh 

o

. ./test.sh 

(le due forme sono sinonimi).

Quando si esegue questa operazione, anziché eseguire lo script in una sotto-shell, bash eseguirà ciascun comando nello script come se fosse stato digitato al prompt.

+0

funziona, ma perché "test.sh bash" non impostare la variabile d'ambiente? Se bash esegue ogni comando nello script come se fosse stato digitato nel prompt, la variabile di ambiente sarebbe stata impostata nel processo corrente? – GDICommander

+2

@GDICommander: No. Quando si esegue 'bash test.sh', viene creato un nuovo processo' bash' che esegue lo script ** ed esce **. – NPE

+1

Ok, grazie per l'informazione. Ora capisco un po 'meglio le variabili d'ambiente. – GDICommander

3

Un'altra alternativa sarebbe quella di avere lo script stampa le variabili che si desidera impostare, con echo export VAR=value e fare eval "$(./test.sh)" nella shell principale. Questo è l'approccio utilizzato da vari programmi [ad es. ridimensionamento, dircolors] che forniscono variabili d'ambiente da impostare.

Questo funziona solo se lo script non ha altra uscita (o se viene visualizzato un altro in uscita su stderr, con >&2)

+0

Perché il downvote? Questo è un modello comune e presenta numerosi vantaggi. – Random832

+0

Questo non ha funzionato per me. Scusate. – FractalSpace

Problemi correlati