2013-02-15 8 views
14

Ich habe ein Skript, das ein paar Variablen enthält, die als UmgebungsvariableExport Variablen in einer anderen Datei definiert

Die Liste der Variablen festgelegt werden müssen, ändern sich ständig und es auf meinem Ende modifiziert ist keine Option. Irgendeine Idee, wie ich es machen würde?

Beispieldatei foo.sh

FOO="FOOFOO" 
BAR="BARBAR" 

Antwort

10

Sie sind für die Suche '' Befehl (auch buchstabiert ‚Quelle‘ in bash):

source foo.sh 

Da Sie sie für die Umwelt als auch für den Export benötigen, müssen Sie möglicherweise ein wenig zusätzliche Arbeit tun:

while read -r line; do 
    export "$line" 
done < foo.sh 
+0

ich habe ein anderes Skript bar.sh die Quelle foo.sh während Zeile gelesen hat; tun exportieren "$ line" getan user2077092

+1

Sie müssten auch "source bar.sh" verwenden, um die aktuelle Umgebung zu beeinflussen. – chepner

+0

Auch die 'while' Schleife ist anstelle von' source foo.sh'; Du brauchst beides nicht. Es ist nicht falsch, nur überflüssig. – chepner

39

Es gibt eine Unterschied zwischen einer Variablen und einer Umgebungsvariablen. Wenn Sie . foo.sh ausführen und foo.sh die Zeile FOO=value enthält, wird die Variable FOO im aktuellen Prozess zugewiesen. Es ist keine Umgebungsvariable. Um eine Umgebungsvariable zu werden (und somit Sub-Shells zur Verfügung zu stehen), muss sie exportiert werden. Allerdings bieten Schalen eine Option, die alle Variablenzuweisungen macht die Variable auf eine Umgebungsvariable zu fördern, wenn Sie also einfach tun:

set -a 
. foo.sh 
set +a 

dann alle Variablenzuweisungen in foo.sh werden im laufenden Prozess gemacht Umgebungsvariablen werden. Beachten Sie, dass dies nicht unbedingt der Fall ist: In der bash ist das Exportieren einer Variablen eine Umgebungsvariable in der aktuellen Shell, aber in anderen Shells (z. B. dem Bindestrich) wird die Variable nicht zu einer Umgebungsvariablen in der aktuellen Shell. (Es tut weil es in der Umgebung von Subshells eingestellt wird, jedoch.)

+0

Vielen Dank, das hat Kopfschmerzen geheilt. Das ist praktisch, wenn Variablen an einen von fcron bearbeiteten Job übergeben werden. – Saucier

+0

... oder beim Umgang mit Umgebungsvariablen von nullmailer. – Saucier

0

Wenn Sie suchen, nur Variablen mit einem gemeinsamen Präfix zu exportieren, zum Beispiel:

BAZ_FOO="FOOFOO" 
BAZ_BAR="BARBAR" 

Sie können dies einfach tun:

. foo.sh 
variable_list=() 
variable_list=($(set -o posix ; set |\ 
        grep "BAZ_"   |\ 
        cut -d= -f1)) 
for variable in "${variable_list[@]}" 
do 
    export "$variable" 
done 
Verwandte Themen