Ustawianie zmiennych środowiskowych systemu Linux

9

Używam Red Hat Linux Enterprise 5; Zawsze używam polecenia eksportu, aby ustawić zmienne środowiskowe.

Czy istnieją inne sposoby ustawiania zmiennych środowiskowych i jakie są ich zalety / wady?

George2
źródło

Odpowiedzi:

16

Oto fragment strony podręcznika użytkownika Bash:

eksport [-fn] [nazwa [= słowo]] ...
eksport -p
Podane nazwy są oznaczone do automatycznego eksportu do środowiska później wykonywanych poleceń. Jeśli podano opcję -f, nazwy odnoszą się do funkcji ...

Jeśli potrzebujesz tylko zmiennej w bieżącym środowisku, nie musisz używać eksportu.

var=value

Edytować:

Bez eksportu: tylko bieżące środowisko. Z eksportem: obecne środowisko i środowiska potomne.

Oto demonstracja wpływu eksportu na dostępność zmiennej w środowisku potomnym i że zmiany w środowisku potomnym nie wpływają na element nadrzędny:

$ var1=123
$ export var2=456
$ echo "parent [$var1] [$var2] [$var3]"
parent [123] [456] []
$ var3=789 bash -c 'echo "child [$var1] [$var2] [$var3]"; var1=111; var2=222; var3=333; echo "child [$var1] [$var2] [$var3]"'
child [] [456] [789]
child [111] [222] [333]
$ echo "parent [$var1] [$var2] [$var3]"
parent [123] [456] []

Po pierwszym echo ( echo "parent...") można zobaczyć „123” i „456”, ponieważ oba var1i var2są aktywne w obecnym otoczeniu. Nie widzisz wartości, var3ponieważ nie została jeszcze ustawiona.

Po wierszu rozpoczynającym się „ var3=...” nie widzisz wartości, var1ponieważ nie została ona wyeksportowana. Ci zrobić zobaczyć wartość var2, ponieważ była eksportowana. Widać wartość var3, ponieważ został ustawiony dla środowiska dziecka tylko .

( bash -cjest równoważne uruchomieniu skryptu z zawartością argumentu do -copcji. Skrypt lub inny plik wykonywalny lub, w tym przypadku, argument do bash -cstaje się dzieckiem bieżącego środowiska, które w rezultacie jest oczywiście dzieckiem rodzic.)

W „skrypcie” wartości zmiennej są zmieniane. Teraz wyświetla te nowe wartości.

Po zakończeniu „skryptu” wykonywanie powraca do środowiska nadrzędnego (w tym przypadku wiersza polecenia). Po ostatnim echu zobaczysz oryginalne wartości, ponieważ zmiany wprowadzone w środowisku potomnym nie wpływają na element nadrzędny.

Dennis Williamson
źródło
Co oznacza „w obecnym środowisku”? Aktualny skrypt bash lub?
George2
1
Tak, oznacza to „w bieżącym skrypcie” lub „w bieżącej sesji interaktywnej”. To wyklucza pliki wykonywalne lub skrypty uruchamiane z bieżącego skryptu lub sesji interaktywnej. Taki jest cel export- udostępnienia zmiennych w tych środowiskach potomnych.
Dennis Williamson
Znajduję pewne konflikty z tego, co powiedziałeś. :-) Powiedziałeś „Aby wykluczyć pliki wykonywalne lub skrypty”, zwróć uwagę na „wyklucz”, ale w tym, co zacytowałeś, wspomniałeś „Podane nazwy są oznaczone do automatycznego eksportu do środowiska później wykonywanych poleceń”. - ma to być „uwzględnienie” (automatyczne eksportowanie do lub wpływ), a nie „wykluczenie”. Jestem zdezorientowany, czy mógłbyś to wyjaśnić?
George2
1
@ George2: Zobacz moją zredagowaną odpowiedź, aby uzyskać więcej informacji.
Dennis Williamson,
3

Mówisz tak

Zawsze używam polecenia eksportu do ustawienia zmiennej środowiskowej

Sposób, w jaki to sformułowałeś, brzmi tak, jakbyś naprawdę próbował zapytać, w jaki sposób utrzymujesz zmienną środowiskową. Aby to zrobić, musisz umieścić swoją export VAR="foo"instrukcję w pliku $ HOME / .bash_profile (jeśli używasz bash). Jeśli chcesz, aby ta zmienna środowiskowa zachowała się dla wszystkich użytkowników oprócz root, dodaj ją do / etc / profile. Jeśli chcesz go dodać także dla użytkownika root, ustaw go w /root/.bash_profile.

Będzie to działać dla wszystkich powłok logowania, w których powłoką jest bash. W przypadku powłok, które nie są zalogowane, musisz użyć .bashrc. Nie mam wglądu w inne pociski: D

wieloryb
źródło
2
Możesz ponownie przeczytać sekcję strony podręcznika użytkownika Bash, aby dowiedzieć się, kiedy te pliki są pobierane.
Dennis Williamson,
1
Tak ... Mam problem z logowaniem i interaktywnością. Edycja mojej odpowiedzi do refleksji. Dziękuję za poprawienie mnie!
whaley
„uczyń zmienną środowiskową trwałą” - co to znaczy trwa?
George2
1
„Utrwalanie” oznacza, że ​​chcesz, aby ta zmienna miała tę wartość przy każdym uruchomieniu powłoki. Może być konieczne wyeksportowanie zmiennej w zależności od jej celu.
Dennis Williamson
1
Oznacza to, że nie sprawiłeś, aby był trwały. Spróbuj zrobić to, co opisał whaley .
Dennis Williamson
1

eksport jest najprostszym sposobem na zrobienie tego, więc dlaczego nie zostawić tego w tym miejscu?

export VARIABLE=value    # for Bourne, bash, and similar shells
setenv VARIABLE value    # for csh and similar shells
BloodPhilia
źródło
2
Powłoka Bourne'a wymaga ZMIENNEJ = wartość; eksport VARIABLE
mpez0
1
To też powinno działać ...
BloodPhilia
@BloodPhilia, dla bash, tylko jeden sposób na ustawienie zmiennej środowiskowej?
George2
1
@ George2 - Korzystając z VARIABLE = wartość, tworzysz zmienną lokalną, która zniknęła po bieżącym wykonaniu skryptu. Podczas korzystania z eksportu procesy potomne dziedziczą wartości zmiennych z procesu macierzystego. Na przykład: FOO=BAR; executethisprogram program executethisprogramNIE BĘDZIE znać wartości zmiennej FOO. Z drugiej strony, przy użyciu: FOO=BAR; export FOO; executethisprogram Program executethisprogrampozna wartość zmiennej FOO.
BloodPhilia
1
executethisprogram nie jest podprocesem „eksportu FOO”. Jest to podproces (podrzędny) skryptu, który go wywołuje lub powłoka interaktywna (wiersza poleceń). export FOOto polecenie, które zaznacza zmienną, FOOaby była dostępna dla procesów potomnych środowiska, w którym polecenie zostało wydane. Ten rodzic może być skryptem lub interaktywną powłoką.
Dennis Williamson,
1

Możesz także zrobić coś takiego:

VAR=val application

Na przykład:

LANG=C ls --help

wyjście w języku angielskim.

LANG=pl_PL ls --help

wyjście w języku polskim (jeśli jest dostępne).

W przeszłości nie można było eksportować VAL = val. Musiałeś

VAL=val; export VAL
gogiel
źródło
Mam wątpliwości co do „VAR = val application”, co oznacza val, a co aplikacji?
George2
2
Te przykłady ustawiają wartość zmiennej dla środowiska potomnego ( lsna przykład) bez wpływu na wartość tej zmiennej w bieżącym (macierzystym) środowisku.
Dennis Williamson
Czy to jest środowisko potomne? Jestem zdezorientowany.
George2
1
lsjest potomkiem procesu, z którego został uruchomiony. Jeśli piszę lsw wierszu polecenia, powłoka interaktywna jest rodzicem i lsdzieckiem. Jeśli mam skrypt, który używa, lsskrypt jest rodzicem i lsdzieckiem.
Dennis Williamson