2013-02-15 11 views
14

Mam skrypt, który zawiera kilka zmiennych, które muszą być ustawione jako środowisko zmiennejzmienne Eksport zdefiniowane w innym pliku

Lista zmiennych stale zmieniać i modyfikowania go na końcu nie jest rozwiązaniem. Masz pomysł, jak to zrobić?

przykładowy plik foo.sh

FOO="FOOFOO" 
BAR="BARBAR" 

Odpowiedz

10

Szukasz dla '' Polecenie (pisane również „źródło” w bash):

source foo.sh 

ponieważ trzeba je wyeksportować do środowiska, a także, być może trzeba zrobić trochę dodatkowej pracy:

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

stworzyłem kolejny bar.sh skryptu, który ma źródłowy foo.sh podczas odczytu linia; do eksportuj "$ line" done user2077092

+1

Musisz też "source bar.sh" również wpłynąć na bieżące środowisko. – chepner

+0

Również pętla 'while' jest zamiast' source foo.sh'; nie potrzebujesz obu. To nie jest złe, po prostu zbędne. – chepner

39

Jest różnica między zmienną a zmienną środowiskową. Jeśli wykonasz . foo.sh i foo.sh zawiera wiersz FOO=value, to zmienna FOO zostanie przypisana w bieżącym procesie. To nie jest zmienna środowiskowa. Aby stać się zmienną środowiskową (a przez to być dostępną do podrzędnych powłok), musi zostać wyeksportowane. Jednakże, muszle zapewniają opcję co sprawia, że ​​wszystkie zadania zmienne promować zmiennej do zmiennej środowiskowej, więc jeśli po prostu zrobić:

set -a 
. foo.sh 
set +a 

wtedy wszystkie przypisania zmiennych w foo.sh będą zmienne środowiskowe w bieżącym procesie. Zauważ, że nie jest to ściśle prawdą: w bashie wyeksportowanie zmiennej sprawia, że ​​jest to zmienna środowiskowa w bieżącej powłoce, ale w innych powłokach (np. Kreska) eksportowanie zmiennej nie czyni jej zmienną środowiskową w bieżącej powłoce. (To powoduje, że należy ustawić go w środowisku podpowłok jednak).

+0

Wielkie dzięki, że leczyć niektóre bóle głowy. Jest to przydatne przy przekazywaniu zmiennych do zadania obsługiwanego przez fcron. – Saucier

+0

... lub w przypadku zmiennych środowiskowych nullmailera. – Saucier

0

Jeśli szukasz eksportować tylko zmienne z wspólny przedrostek, np:

BAZ_FOO="FOOFOO" 
BAZ_BAR="BARBAR" 

Można po prostu to zrobić:

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