Odpowiedzi:
W przypadku powłok kompatybilnych z POSIX (w tym Bash) standard mówi:
2.5.3 Zmienne otoczki
Zmienne należy inicjować ze środowiska [...] Jeżeli zmienna jest inicjowana ze środowiska, należy ją natychmiast oznaczyć do eksportu; zobacz specjalne wbudowane eksportowanie. Nowe zmienne można zdefiniować i zainicjować za pomocą przypisań zmiennych, [itd.]
Oraz o export
:
export name[=word]...
Powłoka przekaże atrybut eksportu do zmiennych odpowiadających podanym nazwom, co spowoduje, że znajdą się one w środowisku później wykonywanych poleceń.
Z punktu widzenia powłoki istnieją tylko zmienne. Niektóre z nich mogły pochodzić ze środowiska podczas uruchamiania powłoki, a niektóre z nich mogą być eksportowane do środowiska procesów uruchamianych przez powłokę.
(„Środowisko” to tak naprawdę tylko kilka ciągów znaków przekazywanych do procesu podczas jego uruchamiania. Gdy proces jest uruchomiony, może robić z tym, co chce, używać go, ignorować, zastępować. I to, co proces przechodzi dalej kiedy uruchamianie innych procesów może być jeszcze inną rzeczą, choć oczywiście zwykle po prostu ponownie przekazujemy wszystkie zmienne środowiskowe).
Jeśli używasz powłoki innej niż POSIX, na przykład csh
rzeczy mogą wyglądać inaczej:
$ csh
% echo $foo
foo: Undefined variable.
% setenv foo bar
% echo $foo
bar
% set foo=asdf
% echo $foo
asdf
% env |grep foo
foo=bar
% exit
Są to jedna i ta sama zmienna. W powłoce, w przeciwieństwie do większości innych języków programowania, zmienne środowiskowe i zmienne powłoki mają tę samą przestrzeń nazw. W powłoce zmienna środowiskowa to zmienna powłoki, która została wyeksportowana export
.
Zobacz na przykład moją odpowiedź na poprzednie pytanie „ Jaka jest różnica w użyciu między zmiennymi powłoki a zmiennymi środowiskowymi? ”
Zmienna powłoki może być używana tylko do bieżącej powłoki, nie można jej używać w całym systemie. Z drugiej strony Zmienna środowiskowa może być stosowana w całym systemie. Zgodnie z konwencją zmienne powłoki są pisane małymi literami, a zmienne środowiskowe pisane są wielkimi literami. Możesz ustawić zmienną powłoki jako zmienną środowiskową, wystarczy ją wyeksportować.