Pytanie Globalne zmienne środowiskowe w skrypcie powłoki


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

Jeśli zrobię coś takiego

#!/bin/bash
FOO=bar

...lub

#!/bin/bash
export FOO=bar

... wydaje się, że vary pozostają w lokalnym kontekście, podczas gdy ja chciałbym ich używać po zakończeniu wykonywania skryptu.


76
2017-09-23 06:25


pochodzenie




Odpowiedzi:


Uruchom skrypt za pomocą . 

. myscript.sh

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

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

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

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


124
2017-09-23 06:28



Bądź ostrożny 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
source to alias dla .. Więc możesz uciekać source myscript.sh zamiast tego, jeśli chcesz być bardziej konkretny. - Ehtesh Choudhury


Kiedy ty biegać skrypt powłoki, jest wykonywany w podrzędnej powłoce, więc nie może wpływać na środowisko powłoki rodzica. Chcesz źródło skryptu, wykonując:

. ./setfoo.sh

To wykonuje go w kontekście obecny powłoki, a nie jak pod muszla.

Ze strony bash man:

. filename [argumenty]
źródło nazwa pliku [argumenty]

Odczytuj i wykonaj polecenia z pliku w bieżącej powłoce   środowisko i zwraca kod zakończenia ostatniego wykonanego polecenia   z nazwy pliku.

Jeśli nazwa pliku nie zawiera ukośnika, używane są nazwy plików w PATH   znajdź katalog zawierający nazwę pliku.

Plik szukany w PATH nie musi być wykonywalny. Kiedy 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 podano jakiekolwiek argumenty, stają się one parametrami pozycyjnymi   kiedy wykonywana jest nazwa pliku.

W przeciwnym razie parametry pozycyjne pozostają niezmienione. Status powrotu   jest stanem ostatniego polecenia opuszczonego w skrypcie (0 jeśli nie   polecenia są wykonywane) i false, jeśli nazwa pliku nie zostanie znaleziona lub nie może   czytaj.


47
2017-09-23 06:29



Interesujące - wcześniej nie widziałem tej składni. Czy jest to odpowiednik źródła ./setfoo.sh? - ire_and_curses
Jest tak samo, tylko szybciej się wpisuje (i bardziej kompatybilny ze starszymi systemami - ksh nie ma polecenia źródłowego, ale ma "."). - paxdiablo


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

6
2017-09-01 00:48



Może tylko odrobinę więcej szczegółów tutaj. Co powiesz na bardzo krótki opis tego, co source robi? - Phillip Cloud
@PhillipCloud type man source w terminalu, a dostaniesz to, czego chcesz. - CDT
Jestem zaznajomiony z source. Może PO nie jest. - Phillip Cloud
@PhillipCloud Chciałbym trochę więcej szczegółów, ja. Jeśli chcesz edytować odpowiedź, zdecydowanie możesz to zrobić. Pomóżcie sprawie i temu wszystkiemu ... Thx! - Dan Rosenstark


#!/bin/bash
export FOO=bar

lub

#!/bin/bash
FOO=bar
export FOO

eksport człowieka:

Powłoka powinna nadać atrybutowi eksportowemu zmienne odpowiadające określonym nazwom, które spowodują, że znajdą się w środowisku później wykonywanych poleceń. Jeżeli po nazwie zmiennej występuje = słowo, wówczas wartość tej zmiennej zostanie ustawiona na słowo.


4
2017-09-23 06:33



Dla każdego początkującego w skryptach powłoki: uwaga: nie ma pustego miejsca między nazwą envvara, znakiem "=" i samą wartością; to by nie działało: export FOO = /mydir/bar - russellhoff


FOO=bar
export FOO

-3
2017-09-23 06:27



To nie działa, nie ustawia zmiennej środowiskowej dla procesu nadrzędnego. - dreamlax
Tylko proces nadrzędny może ustawić zmienną środowiskową dla procesu nadrzędnego. - glenn jackman