Co robi eksport w BASH? [duplikować]

74

Możliwa duplikat:
Różnica między „a = b” i „export a = b” w bash

Trudno to przyznać, ale nigdy tak naprawdę nie zrozumiałem, co dokładnie exportrobi zmienna środowiskowa. Wiem, że jeśli nie wyeksportuję zmiennej, czasami nie widzę jej w procesach potomnych, ale czasami wydaje się, że mogę. Co tak naprawdę się dzieje, kiedy mówię

export foo=5

a kiedy nie powinienem eksportować zmiennej?

Chas. Owens
źródło
Oto link do co najmniej jednego innego pomocnego pytania na ten temat: superuser.com/questions/143413/linux-environment-variables ... ponieważ jak na ironię to pytanie pojawiło się w Google w odpowiedzi na moje pytanie dotyczące eksportu w bash .
Ogre Psalm33
1
Również: superuser.com/questions/18988/…
Ogre Psalm33
Jednym z powszechnych zastosowań jest dodawanie exportinstrukcji do .bashrc / .bash_profile w celu stworzenia trwałych zmiennych globalnych podobnych do $HOME.
Evan Plaice,
Ostrożnie, w tej historii jest więcej niż się początkowo wydaje. Zapraszam do sprawdzenia mojej odpowiedzi.
jasonleonhard

Odpowiedzi:

15

Od man bash:

ŚRODOWISKO

Po wywołaniu programu otrzymuje tablicę ciągów zwanych środowiskiem. To jest lista par nazwa-wartość w postaci nazwa = wartość.

Powłoka zapewnia kilka sposobów manipulowania środowiskiem. Podczas wywoływania powłoka skanuje własne środowisko i tworzy parametr dla każdej znalezionej nazwy, automatycznie oznaczając ją do eksportu do procesów potomnych. Wykonane polecenia dziedziczą środowisko. Polecenia export i declare -x umożliwiają dodawanie i usuwanie parametrów i funkcji ze środowiska. Jeśli wartość parametru w środowisku zostanie zmodyfikowana, nowa wartość stanie się częścią środowiska, zastępując starą. Środowisko odziedziczone przez dowolne wykonane polecenie składa się ze środowiska początkowego powłoki, którego wartości mogą być modyfikowane w powłoce, pomniejszone o wszelkie pary usunięte przez unset polecenie, a także wszelkie dodatki poprzez eksport i declare -xpolecenia.

sml
źródło
72
Kopiowanie i wklejanie fragmentu dokumentacji przez IMHO bez dodatkowego wysiłku wyjaśniania nie powinno być popierane.
Artur
29
Ten fragment nie jest zbyt jasny i szczerze mówiąc, nie zrozumiałem, co się dzieje.
Trismegistos,
4
@Artur: wręcz przeciwnie: jeśli (fragment z) dokumentacji odpowiada na pytanie, wolałbym nie mieć dodatkowych wyjaśnień.
René Nyffenegger,
1
@ RenéNyffenegger, ale wydaje się, że nie. Przynajmniej nie dostałem go, dopóki nie przeczytałem odpowiedzi BloodPhilia, którą należy oznaczyć jako zaakceptowaną.
Vladislav Rastrusny
1
Uważam, że punkty, które wysunęli Artur i Trismegistos, to to, że każdy może skopiować wklej, to nie zawsze wystarcza, wyjaśnia i zapewnia dobrą odpowiedź. Można skopiować i wkleić dokumentację lub podać link, w rzeczywistości jest to zalecane, ale powinno być dodatkowe wyjaśnienie dotyczące jakości. Co więcej, takie wyjaśnienie może łatwo zignorować ludzie tacy jak RenéNyffenegger, jeśli nie będą go potrzebować, ale będą dostępne dla tych, którzy z niego skorzystają. Wszyscy próbujemy się uczyć i mamy różne sposoby na zdobycie zrozumienia, pomaga to w różnych stylach uczenia się i poprawia twoją ocenę.
jasonleonhard
98

Wyeksportowane zmienne są przekazywane do procesów potomnych, a nie eksportowane zmienne nie.

BloodPhilia
źródło
Czy możesz wskazać jakąkolwiek dokumentację dotyczącą tego. Szukam więcej informacji niż to. Na przykład, czy zmienną należy wyeksportować tylko raz, czy też trzeba ją wyeksportować po każdej zmianie itp.
Chas. Owens
3
Możesz to zweryfikować, dodając coś do ścieżki (powiedz to PYTHONPATH), a następnie zauważając, że chociaż możesz, echo $PYTHONPATHto nie jest rozpoznawane przez skrypty python lub bash, dopóki to exportnie zrobisz
Kaushik Ghose
Ta odpowiedź również nie wydaje się do końca prawdziwa. Na przykład podpowłoki Bash są procesami potomnymi (zgodnie z $BASHPID), a jednak można odczytać niewyportowane zmienne z powłoki nadrzędnej. Prosty dowód: x="y"; echo "$BASHPID: $x"; (echo "$BASHPID: $x") Domyślam się, że jest to szczególny przypadek, który występuje, gdy proces potomny jest podpowłoką.
JepZ
20

Podczas używania exportdodajesz zmienną do listy zmiennych środowiskowych powłoki, w której wywołano polecenie eksportu, a wszystkie zmienne środowiskowe powłoki są przekazywane do procesów potomnych, dlatego możesz jej użyć.

Po zakończeniu powłoki środowisko jest zniszczone, dlatego zmienne środowiskowe są deklarowane i eksportowane przy logowaniu, na przykład w pliku .bashrc

alfredozn
źródło