Wydaje się, że Bash rozróżnia zmienne, które zostały wyeksportowane, i te, które nie zostały wyeksportowane.
przykład:
$ FOO=BAR
$ env | grep FOO
$ set | grep FOO
FOO=BAR
set
widzi zmienną, ale jej env
nie widzi .
$ export BAR=FOO
$ env | grep FOO
BAR=FOO
$ set | grep FOO
BAR=FOO
FOO=BAR
set
widzi obie zmienne, ale env
widzi tylko wyeksportowaną zmienną.
Wiem, że set
to wbudowane bash i env
nie jest.
Jakie są różnice między zmiennymi, które są eksportowane, a tymi, które nie są?
shell
environment-variables
lesmana
źródło
źródło
Odpowiedzi:
Wyeksportowane zmienne są przenoszone do środowiska poleceń wykonywanych przez powłokę, która je wyeksportowała, podczas gdy niewyeksportowane zmienne są lokalne dla bieżącego wywołania powłoki. Ze strony podręcznika
export
:set
generuje bieżące środowisko, które obejmuje dowolne lokalne nieeksportowane zmienne.env
służy do uruchamiania programów w nowym środowisku i bez argumentów wyświetli to, czym byłoby to nowe środowisko. Ponieważenv
tworzy nowe środowisko, przenoszone są tylko eksportowane zmienne, tak jak w przypadku każdego programu uruchamianego z tej powłoki. Na przykład, spawnowanie drugiej powłoki w pierwszej (kiedyś$$
reprezentowałem podpowiedzi w wewnętrznej powłoce):Zauważ, że eksportowana jest zmienna, a nie tylko jej wartość. Oznacza to, że po ciebie
export FOO
,FOO
staje się zmienną globalną i pojawia się w kolejnych środowisk, nawet jeśli później zmienić:źródło
locale
dla bieżącej powłoki nie wyświetla aktualizacji?