2009-09-23 16 views
74

Jak ustawić zmienną środowiskową globalnych w skrypcie bash?globalne zmienne środowiskowe w skrypcie powłoki

Jeśli robię rzeczy jak

#!/bin/bash 
FOO=bar 

... lub

#!/bin/bash 
export FOO=bar 

... te Vars wydają się pozostawać w kontekście lokalnym, natomiast chciałbym, aby utrzymać je po użyciu skrypt zakończył wykonywanie.

Odpowiedz

121

Uruchom skrypt .

. myscript.sh 

Spowoduje to uruchomienie skryptu w bieżącym środowisku powłoki.

export reguluje który będzie dostępny dla nowych procesów zmienne, więc jeśli powiesz

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

następnie $BAR będzie dostępna w środowisku runScript.sh, ale $FOO nie będzie.

+24

Ostrożnie z tym pierwszym. Bez ukośnika będzie wyglądał na twojej ścieżce: użyj czegoś takiego jak ". ./myscript.sh 'jeśli chcesz mieć pewność, że uruchomi on konkretny. – paxdiablo

+1

Myślałem, że globalny był GLOBALNY !!! Spowoduje to wyczyszczenie ostatniej godziny rozwiązywania problemów: – Dennis

+8

'source' jest aliasem dla' .'. Możesz więc uruchomić 'source myscript.sh', jeśli chcesz być bardziej bezpośredni. –

-3
FOO=bar 
export FOO 
+2

to nie działa, to nie ustawić zmienną środowiskową dla procesu macierzystego. – dreamlax

+3

Tylko proces nadrzędny może ustawić zmienną środowiskową dla procesu nadrzędnego. –

45

Po wykonaniu skryptu powłoki jest on wykonywany w podrzędnej powłoce, więc nie może wpływać na środowisko powłoki nadrzędnej. Chcesz pozyskać skryptu wykonując:

. ./setfoo.sh 

ta wykonuje ją w kontekście powłoki prąd, a nie jako sub powłoki.

Od strony man bash:

. nazwa_pliku [argumenty]
źródło nazwa_pliku [argumenty]

odczyt i wykonywanie poleceń z pliku w bieżącym środowisku powłoki i zwraca kod zakończenia ostatniego wykonanego polecenia z pliku.

Jeśli nazwa pliku nie zawiera ukośnika, nazwy plików w PATH są używane do znajdowania katalogu zawierającego nazwę pliku.

Plik poszukiwany w PATH nie musi być wykonywalny. Gdy bash nie jest w trybie POSIX, aktualny katalog jest przeszukiwany, jeśli nie znaleziono pliku w PATH.

Jeśli opcja sourcepath do polecenia wbudowanego shopt jest wyłączona, , PATH nie jest przeszukiwana.

Jeśli jakieś argumenty są dostarczane, stają się parametry pozycyjne gdy plik jest wykonywany.

przeciwnym razie parametry pozycyjne pozostają bez zmian.Status zwrotu: jest stanem ostatniego polecenia zakończonego w skrypcie (0, jeśli nie są wykonywane żadne polecenia ), i false, jeśli nazwa pliku nie została znaleziona lub nie można odczytać .

+0

Interesujące - wcześniej nie widziałem tej składni. Czy jest to odpowiednik źródła ./setfoo.sh? –

+2

To samo, szybsze do wpisania (i bardziej kompatybilne ze starszymi systemami - ksh nie ma polecenia źródłowego, ale ma "."). – paxdiablo

4
#!/bin/bash 
export FOO=bar 

lub

#!/bin/bash 
FOO=bar 
export FOO 

eksport człowiek:

Powłoka powinna dać atrybut eksportu do zmiennych odpowiadających określonych nazw, które powinny spowodować, że będą w środowisko później wykonanych poleceń. Jeżeli po nazwie zmiennej występuje = słowo, wówczas wartość tej zmiennej zostanie ustawiona na słowo.

+0

Proszę każdemu nowicjuszowi w skryptach powłoki: uwaga: nie ma pustego miejsca między nazwą envvara, znakiem "=" a samą wartością; to nie zadziała: 'export FOO =/mydir/bar' – russellhoff

6

source myscript.sh jest również wykonalne.

Opis dla komendy 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

Może tylko odrobinę więcej szczegółów tutaj. Co powiesz na bardzo krótki opis tego, co robi 'source'? –

+0

@PhillipCloud wpisz 'man source' w terminalu, a dostaniesz to, czego chcesz. – CDT

+5

Jestem zaznajomiony z 'source'. Może PO nie jest. –