Przeczytałem tutaj, że celem export
powłoki jest udostępnienie zmiennej podprocesom uruchamianym z powłoki.
Jednak przeczytałem tu i tutaj, że „Procesy dziedziczą swoje środowisko po rodzicach (proces, który je rozpoczął)”.
Jeśli tak jest, dlaczego potrzebujemy export
? czego mi brakuje?
Czy zmienne powłoki nie są domyślnie częścią środowiska? Jaka jest różnica?
shell
process
environment-variables
Amelio Vazquez-Reina
źródło
źródło
set -k
jest taki, że można użyćcmd ENVVAR=value
zamiastENVVAR=value cmd
, który nie będzie działał w twoim przykładzie, chyba żeset -k
został uruchomiony przed wywołaniemf
. Ponadto niewiele powłok obsługuje go obecnie i tylko dla kompatybilności wstecznej z powłoką Bourne'a. W powłoce Bourne'a (lub Korna) nie działałoby to dla funkcji. A ponieważ wpływa na parsowanie powłoki, musi obowiązywać w momencie, gdy powłoka odczytuje kod, który z niej korzysta.set -a
Istnieje różnica między zmiennymi powłoki a zmiennymi środowiskowymi. Jeśli zdefiniujesz zmienną powłoki bez
export
jej wczytania, nie zostanie ona dodana do środowiska procesów, a zatem nie odziedziczona po jej elementach potomnych.Za pomocą polecenia
export
każ powłoce dodać zmienną powłoki do środowiska. Możesz to przetestować za pomocąprintenv
(który po prostu wypisuje swoje środowiskostdout
, ponieważ jest to proces potomny, w którym widać efektexport
ing zmiennych):źródło
Po wyeksportowaniu zmienna jest częścią środowiska.
PATH
jest eksportowany do samej powłoki, a zmienne niestandardowe można eksportować w razie potrzeby. Za pomocą kodu instalacyjnego:Porównać
Z
Ponieważ
foo
nie jest eksportowany przez powłokę itest2.sh
nigdy go nie eksportował, nie był częścią środowiskasubshell.sh
w ostatnim uruchomieniu.źródło