Globalne zmienne środowiskowe w skrypcie powłoki

83

Jak ustawić globalną zmienną środowiskową w skrypcie bash?

Jeśli robię takie rzeczy

#!/bin/bash
FOO=bar

...lub

#!/bin/bash
export FOO=bar

... zmienne wydają się pozostawać w lokalnym kontekście, ale chciałbym nadal ich używać po zakończeniu wykonywania skryptu.

Alex
źródło

Odpowiedzi:

143

Uruchom swój skrypt z .

. myscript.sh

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

export określa, które zmienne będą dostępne dla nowych procesów, więc jeśli tak powiesz

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

następnie $BARbędzie dostępna w środowisku runScript.sh, ale $FOOnie będzie.

tłum
źródło
27
Uważaj na ten pierwszy. Bez ukośnika będzie wyglądać na Twojej ścieżce: użyj czegoś takiego jak '. ./myscript.sh ', jeśli chcesz mieć pewność, że działa na konkretnym.
paxdiablo
13
sourcejest aliasem dla .. Więc source myscript.shzamiast tego możesz biegać , jeśli chcesz być bardziej wyraźny.
Ehtesh Choudhury,
Zastanawiam się, co się dzieje, gdy uruchamiam skrypt z kropką i spacją. przykład. myscript
cNgamba
54

Po uruchomieniu skryptu powłoki odbywa się to w powłoce podrzędnej, więc nie może wpływać na środowisko powłoki nadrzędnej. Chcesz pobrać skrypt, wykonując:

. ./setfoo.sh

Powoduje to wykonanie go w kontekście bieżącej powłoki, a nie jako podrzędny .

Ze strony podręcznika bash:

. nazwa_pliku [argumenty]
nazwa pliku źródłowego [argumenty]

Odczytaj i wykonaj polecenia z nazwa_pliku w bieżącym środowisku powłoki i zwróć kod zakończenia ostatniego polecenia wykonanego z nazwy pliku.

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

Plik wyszukiwany w PATH nie musi być wykonywalny. Gdy bash nie jest w trybie POSIX, przeszukiwany jest katalog bieżący, jeśli żaden plik nie zostanie znaleziony w PATH.

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

Jeśli podano jakiekolwiek argumenty, stają się one parametrami pozycyjnymi podczas wykonywania nazwy pliku.

W przeciwnym razie parametry pozycyjne pozostają niezmienione. Status powrotu to stan ostatniego polecenia zakończonego w skrypcie (0, jeśli żadne polecenie nie zostało wykonane), a fałsz, jeśli nazwa pliku nie została znaleziona lub nie można jej odczytać.

paxdiablo
źródło
Ciekawe - wcześniej nie widziałem tej składni. Czy jest to odpowiednik source ./setfoo.sh?
ire_and_curses
2
Jest to samo, tylko szybsze do wpisywania (i bardziej kompatybilne na starszych systemach - ksh nie ma polecenia źródła, ale ma znak „.”).
paxdiablo
9

source myscript.sh jest również wykonalne.

Opis polecenia linux source:

source is a Unix command that evaluates the file following the command, 
as a list of commands, executed in the current context
CDT
źródło
Może trochę więcej szczegółów tutaj. A może bardzo krótki opis tego, co sourcerobi?
Phillip Cloud
@PhillipCloud wpisz man sourceterminal, a otrzymasz to, czego chcesz.
CDT,
5
Jestem zaznajomiony source. Może OP nie jest.
Phillip Cloud,
2
@PhillipCloud Sam chciałbym uzyskać więcej szczegółów. Jeśli chcesz edytować odpowiedź, zdecydowanie możesz to zrobić. Pomóż sprawie i tak dalej ... Dzięki!
Dan Rosenstark
4
#!/bin/bash
export FOO=bar

lub

#!/bin/bash
FOO=bar
export FOO

eksport ludzi:

Powłoka nada atrybut eksportu zmiennym odpowiadającym określonym nazwom, co spowoduje, że znajdą się one w środowisku kolejnych wykonywanych poleceń. Jeżeli po nazwie zmiennej występuje = słowo, wówczas wartość tej zmiennej należy ustawić na słowo.

Andrejs Cainikovs
źródło
Proszę, dla każdego początkującego w skryptach powłoki: pamiętaj, że nie ma spacji między nazwą envvar, znakiem „=” a samą wartością; to nie zadziała:export FOO = /mydir/bar
russellhoff
-3
FOO=bar
export FOO
Niko
źródło
2
To nie działa, nie ustawia zmiennej środowiskowej dla procesu nadrzędnego.
dreamlax
3
Tylko proces nadrzędny może ustawić zmienną środowiskową dla procesu nadrzędnego.
glenn jackman