Zmienne powłoki
Zmienne powłoki to zmienne, których zakres znajduje się w bieżącej sesji powłoki, na przykład w interaktywnej sesji powłoki lub skrypcie.
Możesz utworzyć zmienną powłoki, przypisując wartość do nieużywanej nazwy:
var="hello"
Zastosowanie zmiennych powłoki służy do śledzenia danych w bieżącej sesji. Zmienne powłoki zwykle mają nazwy z małymi literami.
Zmienne środowiska
Zmienna środowiskowa to zmienna powłoki, która została wyeksportowana. Oznacza to, że będzie ona widoczna jako zmienna, nie tylko w sesji powłoki, która ją utworzyła, ale także dla każdego procesu (nie tylko powłoki), który jest uruchamiany z tej sesji.
VAR="hello" # shell variable created
export VAR # variable now part of the environment
lub
export VAR="hello"
Po wyeksportowaniu zmiennej powłoki, pozostaje ona wyeksportowana, dopóki nie zostanie rozbrojona lub dopóki jej „właściwość eksportu” nie zostanie usunięta („ export -n
in” bash
), więc zazwyczaj nie trzeba jej ponownie eksportować. Wyłączenie zmiennej unset
powoduje jej usunięcie (bez względu na to, czy jest to zmienna środowiskowa, czy nie).
Tablice i asocjacyjne skróty w bash
oraz inne powłoki nie mogą być eksportowane jako zmienne środowiskowe. Zmienne środowiskowe muszą być prostymi zmiennymi, których wartości są łańcuchami, i często mają nazwy składające się z wielkich liter.
Wykorzystanie zmiennych środowiskowych służy do śledzenia danych w bieżącej sesji powłoki, ale także do umożliwienia każdemu rozpoczętemu procesowi uwzględnienia tych danych. Typowym tego przykładem jest PATH
zmienna środowiskowa, która może być ustawiona w powłoce, a następnie używana przez dowolny program, który chce uruchomić programy bez podawania pełnej ścieżki do nich.
Zbiór zmiennych środowiskowych w procesie jest często określany jako „środowisko procesu”. Każdy proces ma swoje własne środowisko.
Zmienne środowiskowe można tylko „przekazywać”, tj. Proces potomny nigdy nie może zmienić zmiennych środowiskowych w procesie macierzystym, a oprócz skonfigurowania środowiska dla procesu potomnego po uruchomieniu, proces macierzysty nie może zmienić istniejącego środowiska proces potomny.
Zmienne środowiskowe mogą być wyświetlane z env
(bez żadnych argumentów). Poza tym wyglądają tak samo jak nieeksportowane zmienne powłoki w sesji powłoki. Jest to trochę wyjątkowe dla powłoki, ponieważ większość innych języków programowania zwykle nie miesza „zwykłych” zmiennych ze zmiennymi środowiskowymi (patrz poniżej).
env
może być również użyty do ustawienia wartości jednej lub kilku zmiennych środowiskowych w środowisku procesu bez ustawiania ich w bieżącej sesji:
env CC=clang CXX=clang++ make
Zaczyna make
się to od zmiennej środowiskowej CC
ustawionej na wartość clang
i CXX
ustawioną na clang++
.
Może być również użyty do oczyszczenia środowiska dla procesu:
env -i bash
To się uruchamia, bash
ale nie przenosi bieżącego środowiska do nowego bash
procesu (nadal będzie mieć zmienne środowiskowe, ponieważ tworzy nowe ze swoich skryptów inicjujących powłokę).
Przykład różnicy
$ var="hello" # create shell variable "var"
$ bash # start _new_ bash session
$ echo "$var" # no output
$ exit # back to original shell session
$ echo "$var" # "hello" is outputted
$ unset var # remove variable
$ export VAR="hello" # create environment variable "VAR"
$ bash
$ echo "$VAR" # "hello" is outputted since it's exported
$ exit # back to original shell session
$ unset VAR # remove variable
$ ( export VAR="hello"; echo "$VAR" ) # set env. var "VAR" to "hello" in subshell and echo it
$ echo "$VAR" # no output since a subshell has its own environment
Inne języki
W większości języków programowania dostępne są funkcje biblioteczne, które umożliwiają pobieranie i ustawianie zmiennych środowiskowych. Zauważ, że ponieważ zmienne środowiskowe są przechowywane jako prosta relacja klucz-wartość, zwykle nie są one „zmiennymi” języka. Program może pobrać wartość (która jest zawsze ciągiem znaków) odpowiadającą kluczowi (nazwie zmiennej środowiskowej), ale będzie musiał następnie przekonwertować ją na liczbę całkowitą lub inny typ danych, jakiego oczekuje język.
W C, zmienne środowiska można uzyskać za pomocą getenv()
, setenv()
, putenv()
i unsetenv()
. Zmienne utworzone za pomocą tych procedur są dziedziczone w ten sam sposób przez dowolny proces uruchamiany przez program C.
Inne języki mogą mieć specjalne struktury danych do osiągnięcia tego samego, jak %ENV
skrót w Perlu lub ENVIRON
tablica asocjacyjna w większości implementacji awk
.