Co robi polecenie „eksport”?

85

Jestem trochę nowy w Linuksie i zdarza mi się wykonywać niektóre polecenia na ślepo, aby załatwić sprawę. Pomyślałem, że nie będzie to marnotrawstwo zadawania tego typu pytań, bo więcej nowych osób będzie miało o nich regularną wiedzę.

Niedawno zacząłem pracować z Jenkinsem , a potem musiałem użyć tego exportpolecenia, aby uruchomić archiwum wojenne Jenkinsa . Musiałem więc wiedzieć, co exportogólnie robi polecenie i dlaczego musimy uruchamiać to polecenie podczas uruchamiania Jenkinsa (po ustawieniu domu Jenkinsa).

Dzięki!

Chathura Kulasinghe
źródło
1
Pomogłoby, gdybyś powiedział więcej o używanym poleceniu eksportu. Bez większego kontekstu przypuszczam, że ustawiasz zmienną środowiskową. Zobacz en.wikipedia.org/wiki/Environment_variable#Unix
Joshua D. Boyd,
możliwy duplikat polecenia eksportu
unixa

Odpowiedzi:

99

exportin shi powiązanych powłokach (takich jak bash) oznacza zmienną środowiskową, która ma zostać wyeksportowana do procesów potomnych, tak aby dziecko je dziedziczyło.

exportjest zdefiniowane w POSIX :

Powłoka nada atrybut eksportu zmiennym odpowiadającym określonym nazwom, co spowoduje, że znajdą się one w środowisku kolejnych wykonywanych poleceń. Jeżeli po nazwie zmiennej występuje = słowo, wówczas wartość tej zmiennej należy ustawić na słowo.

Yann Ramin
źródło
Wielkie dzięki! Wszystkie Twoje odpowiedzi były naprawdę pomocne i pomagają nauczyć się kilku innych rzeczy! :-)
Chathura Kulasinghe
1
Czym jest proces dziecięcy w tym sensie?
Zinan Xing
13
Nie rozumiem
Martin Hansen
@MartinHansen czego nie rozumiesz? zobacz także moją odpowiedź.
barlop
Na końcu linku znajduje się dodatkowy nawias kwadratowy, nie mogę go edytować, ponieważ jest to edycja z jednym symbolem :)
Radoslav Stoyanov
27

Myślę, że wychodzisz z tła systemu Windows. Więc zestawię je ze sobą (jestem też trochę nowy w Linuksie). Znalazłem odpowiedź użytkownika na mój komentarz, która była przydatna w rozwiązywaniu problemów.

W systemie Windows zmienna może być trwała lub nie. Termin zmienna środowiskowa obejmuje zmienną ustawioną w powłoce cmd za pomocą polecenia SET, a także wtedy, gdy zmienna jest ustawiana w interfejsie GUI systemu Windows, a zatem jest umieszczana w rejestrze i staje się widoczna w nowych oknach cmd. np. dokumentacja dla polecenia set w systemie Windows https://technet.microsoft.com/en-us/library/bb490998.aspx „Wyświetla, ustawia lub usuwa zmienne środowiskowe. Używane bez parametrów, set wyświetla bieżące ustawienia środowiska”. W Linuksie set nie wyświetla zmiennych środowiskowych, wyświetla zmienne powłoki, których nie wywołuje / nie odwołuje się do zmiennych środowiskowych. Ponadto Linux nie używa set do ustawiania zmiennych (poza parametrami pozycyjnymi i opcjami powłoki, które wyjaśniam na końcu jako uwaga), tylko do ich wyświetlania, a nawet wtedy tylko do wyświetlania zmiennych powłoki. Windows używa set do ustawiania i wyświetlania np. Set a = 5, linux tego nie robi.

W Linuksie myślę, że można by stworzyć skrypt, który ustawia zmienne podczas startu, np. /etc/profileLub w /etc/.bashrcinnym przypadku, nie są one trwałe. Są przechowywane w pamięci RAM.

W Linuksie istnieje rozróżnienie między zmiennymi powłoki i zmiennymi środowiskowymi. W systemie Linux zmienne powłoki znajdują się tylko w bieżącej powłoce, a zmienne środowiskowe znajdują się w tej powłoce i we wszystkich powłokach potomnych.

Możesz przeglądać zmienne powłoki za pomocą setpolecenia (choć zauważ, że w przeciwieństwie do systemu Windows, zmienne nie są ustawiane w systemie Linux za pomocą polecenia set).

set -o posix; set (zrobienie tego set -o posix raz jako pierwsze pomaga nie wyświetlać zbyt wielu niepotrzebnych rzeczy). Więc setwyświetla zmienne powłoki.

Za pomocą envpolecenia można przeglądać zmienne środowiskowe

zmienne powłoki są ustawiane za pomocą np. just a = 5

zmienne środowiskowe są ustawiane podczas eksportu, eksport również ustawia zmienną powłoki

Tutaj widzisz zmienną powłoki zzz ustawioną na zzz = 5 i widzisz, że jest wyświetlana podczas działania, setale nie jest wyświetlana jako zmienna środowiskowa.

Tutaj widzimy zestaw yyy z eksportem, więc jest to zmienna środowiskowa. I zobacz, jak pokazuje się zarówno pod zmiennymi powłoki, jak i zmiennymi środowiskowymi

$ zzz=5

$ set | grep zzz
zzz=5

$ env | grep zzz

$ export yyy=5

$ set | grep yyy
yyy=5

$ env | grep yyy
yyy=5

$

inne przydatne wątki

/unix/176001/how-can-i-list-all-shell-variables

/ubuntu/26318/environment-variable-vs-shell-variable-whats-the-difference

Uwaga - jedną kwestią, która trochę się rozwija i jest nieco poprawiająca to, co napisałem, jest to, że w linux bash, 'set' może być używane do ustawiania "parametrów pozycyjnych" i "opcji / atrybutów powłoki", i technicznie oba to są zmienne, chociaż strony podręcznika mogą ich nie opisywać jako takie. Ale nadal, jak wspomniano, set nie ustawi zmiennych powłoki ani zmiennych środowiskowych). Jeśli to zrobisz set asdf, ustawia $ 1 na asdf, a jeśli echo $1widzisz asdf. Jeśli zrobiszset a=5nie ustawi zmiennej a równej 5. Ustawi parametr pozycyjny $ 1 równy łańcuchowi „a = 5”. Więc jeśli kiedykolwiek widziałeś set a = 5 w Linuksie, to prawdopodobnie błąd, chyba że ktoś faktycznie chciał, aby łańcuch a = 5, w 1 $. Inną rzeczą, którą zestaw linux może ustawić, są opcje / atrybuty powłoki. Jeśli ustawisz -o, zobaczysz ich listę. Możesz na przykład set -o verbosewyłączyć, aby włączyć szczegółowe informacje (przy okazji domyślnie jest wyłączone, ale to nie ma znaczenia). Możesz też set +o verbosewyłączyć szczegółowe informacje. System Windows nie ma takiego zastosowania dla swojego polecenia set.

barlop
źródło
wygląda na to, że set pokazuje powłokę i środowisko, a 'env' pokazuje tylko środowisko
barlop
1
Bardzo polub tę odpowiedź, ponieważ obejmuje przypadki nix vs win, które na początku mogą być mylące.
N0thing
6

Mówiąc prościej, zmienne środowiskowe są ustawiane podczas otwierania nowej sesji powłoki. W dowolnym momencie, jeśli zmienisz jakiekolwiek wartości zmiennych, powłoka nie będzie miała możliwości wybrania tej zmiany. oznacza to, że wprowadzone zmiany zaczną obowiązywać w nowych sesjach powłoki. Z exportdrugiej strony polecenie zapewnia możliwość zaktualizowania bieżącej sesji powłoki o zmianę wprowadzoną w eksportowanej zmiennej. Nie musisz czekać do nowej sesji powłoki, aby użyć wartości zmiennej, którą zmieniłeś.

katwekibs
źródło
1
Ale jeśli powiem, a=5wtedy echo $ajest 5. Jednak napisałeś „w dowolnym momencie, jeśli zmienisz którąkolwiek z wartości zmiennych, powłoka nie ma możliwości wybrania tej zmiany. Oznacza to, że zmiany, które wprowadziłeś, stają się skuteczne w nowych sesjach powłoki”. . <- Jak więc zaktualizował sesję powłoki bez eksportu. Czy możesz podać przykład, w którym eksport jest konieczny?
Barlop
Zmienna ustawiona podczas sesji powłoki jest zmienną powłoki. jest lokalna i dostępna dla bieżącej sesji powłoki. możesz go zmienić w dowolnym momencie, a jego aktualna wartość będzie dostępna dla bieżącego procesu powłoki bez konieczności eksportowania zmian. z drugiej strony zmienne środowiskowe są ustawiane w czasie logowania. kiedy zmieniasz jakąkolwiek z ich wartości, musisz wykonać coś, co w uproszczeniu byłoby odświeżeniem, udostępniając nową wartość zarówno bieżącemu procesowi powłoki, jak i nowym procesom potomnym. dokładnie to robi eksport.
katwekibs