Co oznacza eksport PATH = coś: $ PATH oznacza?

27

Jestem bardzo nowy w Linuksie i umieściłem następujące polecenie na końcu pliku .profilew folderze domowym:

export PATH="~/.composer/vendor/bin:$PATH"

Znam problemy zmiennych środowiskowych i ich wartości nieco z systemu Windows, ale w tym przypadku chcę zrozumieć, co robi to polecenie i jakie są jego części:

  1. Co to jest ta „eksportowa” fraza na początku? Czy eksportuje dane, aby były dostępne dla Bash?

  2. Co jest pierwsze, PATHa co drugie $PATHi dlaczego potrzebujemy dwóch?

JohnDoea
źródło
Pomijając pewne różnice techniczne między systemami operacyjnymi, jest to równoważne z tym procesem w systemie Windows: windowsitpro.com/systems-management/…
Two-Bit Alchemist
1
„eksport” powoduje, że zmiana jest widoczna dla nowych programów uruchomionych przez bash.
Thorbjørn Ravn Andersen
1
@ ThorbjørnRavnAndersen: nie, dzieje się tak niezależnie od tego, czy używasz exportpolecenia, czy nie , ponieważ PATHzmienna jest już oznaczona jako wyeksportowana. (Wypróbuj obie strony, jeśli mi nie wierzysz!)
David,

Odpowiedzi:

39

Co to jest ta „eksportowa” fraza na początku?

exportjest poleceniem (a dokładniej wbudowanym Bash , tzn. nie jest plikiem wykonywalnym PATH, jest to polecenie, które Bash ma wbudowane w siebie).

Czy eksportuje dane, aby były dostępne dla Bash?

exportustawia zmienną środowiskową po lewej stronie przypisania na wartość po prawej stronie przypisania; taka zmienna środowiskowa jest widoczna dla procesu, który ją ustawia oraz dla wszystkich podprocesów spawnowanych w tym samym środowisku, tj. w tym przypadku dla instancji Bash, która pobiera źródła ~/.profilei dla wszystkich podprocesów spawnowanych w tym samym środowisku (które mogą obejmować np. również inne powłoki , który z kolei będzie mógł uzyskać do niego dostęp).

Co jest pierwsze, PATHa co drugie $PATHi dlaczego potrzebujemy dwóch?

Pierwszym, PATHjak wyjaśniono powyżej, jest zmienna środowiskowa, którą należy ustawić export.

Ponieważ PATHzazwyczaj zawiera coś, gdy ~/.profilepochodzi (domyślnie zawiera /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games), po prostu ustawiając PATHdo ~/.composer/vendor/binstałaby PATHzawierać tylko ~/.composer/vendor/bin.

Skoro zatem odwołania do zmiennej w poleceniu są zastępowane (lub „rozszerzane”) wartością zmiennej przez Bash w czasie oceny polecenia , :$PATHto jest umieszczane na końcu wartości, która ma zostać przypisana, PATHtak aby PATHostatecznie zawierała ~/.composer/vendor/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games( tzn. co PATHzawiera już plus ~/.composer/vendor/bin:na początku).

kos
źródło
Wspaniałe wyjaśnienie.
Choylton B. Higginbottom
16

https://help.ubuntu.com/community/EnvironmentVariables prawdopodobnie Ci pomoże. Również man bashmoże być bardzo pomocne w zrozumieniu jak to działa (przynajmniej w Bash)

W każdym razie - PATH=jeśli chodzi o ustawianie PATHzmiennej, dodawanie nowych ścieżek do przeszukania, dodawanie na końcu już / wcześniej ustawionych ścieżek, za pomocą $PATH(co jest w zasadzie odniesieniem do PATHzmiennej).

Powiedzmy, że do PATHtej pory ustawiłeś coś takiego:

PATH="x:y:z"

a potem ustawiłeś

PATH="a:b:c:$PATH"

twoje PATHpo tym będzie jak:

a:b:c:x:y:z

Mam nadzieję, że to ma sens.

Ponadto eksportujesz nową zmienną, aby była znana w twoim środowisku, w tym również w procesach potomnych / podpowłokach.

Pamiętaj tylko, że kolejność ustawionych katalogów PATHmoże być ważna. A coś takiego PATH="$PATH:a:b:c"da ci wynik:

x:y:z:a:b:c

co wpłynie na kolejność katalogów / ścieżek podczas wyszukiwania polecenia (jeśli masz polecenie w więcej niż jednym z katalogów, zostanie użyte pierwsze znalezione - co może czasami dać nieoczekiwane rezultaty).

Jacek
źródło
2

Oto polecenie, aby każdy mógł śledzić przebieg pocisków. export PATH="~/.composer/vendor/bin:$PATH"

  • exportWbudowana powłoka (co oznacza, że ​​nie ma /bin/export, to sprawa powłoki) zasadniczo udostępnia zmienne środowiskowe innym programom wywoływanym z bash(patrz powiązane pytanie w Dodatkowym czytaniu) i podpowłokach.
  • Przyporządkowanie w powłoce zajmie najpierw rozszerzenie, a następnie przydział zajmie drugie miejsce. Tak więc to, co jest w środku, cudzysłowy jest najpierw rozwijane, a PATHpóźniej zapisywane w zmiennej.
  • $PATHjest domyślnym PATHprzypisaniem (lub przynajmniej, jak wygląda zmienna do momentu pojawienia się tego polecenia w twoim .bashrclub .profile), i rozwiń je.
  • ~/.composer/vendor/binrozwinie się do /home/username/.composer/vendor/bin, gdzie .composerjest ukryty folder ze względu na wiodącą kropkę.
  • Ta krótka ~/.composer/vendor/bin:$PATHzmieniła się teraz w długą listę folderów, oddzieloną przez :. Wszystko jest ujęte w podwójne cudzysłowy, dlatego uwzględniamy foldery ze spacjami na ich ścieżce.
  • Na koniec wszystko jest przechowywane w PATHzmiennej, a zewnętrzne polecenia mogą z niego korzystać

Prosty przykład

Moja interaktywna powłoka jest w rzeczywistości mksh, co dzieje się również exportpolecenie wbudowane. Używając exportset VAR, moja zmienna może zostać przekazana i wykorzystana przez kolejny łańcuch poleceń / podprocesów, gdzie wyeksportowałem tę samą zmienną

$ echo $SHELL            
/bin/mksh
$ VAR="HelloAskUbuntu"
$ bash -c 'echo $VAR' 
$ export VAR="HelloAskUbuntu"                                                  
$ bash -c 'echo $VAR'                                                          
HelloAskUbuntu
$ 

Dodatkowe czytanie

Sergiy Kolodyazhnyy
źródło
3
Nie, ~w ~/.composer/vendor/binnie zostanie poszerzona! Tylda jest rozwijana tylko w kilku specjalnych miejscach, takich jak bezpośrednio po =znaku. PATH="~/.foo:$PATH"powoduje w ~/.foo:/other/path/dirs.... Ale ~zostanie rozszerzony PATH=~"/.foo:$PATH", co skutkuje /home/user/.foo:/other/path/dirs....
Volker Siegel
2

Czytałem tutaj i w innych miejscach w sieci, rozmawiałem o tym z przyjacielem i zdecydowałem, że jako student pierwszego roku (być może bardziej początkujący Ubuntu niż niektórzy tutaj mogą myśleć), powinienem zmapować to polecenie - powinienem zrobić mapę i dowiedz się, co to jest i gdzie:

Wstępne dane

Jeśli na razie nie zrozumiałeś czegoś w tym rozdziale - nie martw się, stanie się ono wyraźniejsze, gdy będziesz czytać dalej, ale aby zrozumieć tę sprawę, musisz przeczytać o zmiennych środowiskowych (EV), ich wartościach i celu . Spróbuję teraz wyjaśnić to polecenie prostymi słowami i metodą mapowania, dla nowych przybyszów takich jak ja i tylko dla nowych przybyszów. Próbowałem zrobić wszystko, co w mojej mocy ...

Mapowanie

export PATH="~/.composer/vendor/bin:$PATH"

Oryginalna wartość EV „PATH” dostarczanego z Ubuntu 15.10 to:

/usr/bin:/usr/sbin

W samej notatce polecenia mamy dwie frazy ŚCIEŻKI. Ostatni to $ PATH - $ mówi „wydrukuj oryginalną wartość lub wartości EV obok ciebie”; EV obok niego to EV ŚCIEŻKI.

Mamy eksportowane samej zmiennej ścieżka (stało się dostępne dla procesów podrzędnych, jak również, IE procesów działających w CLI, które nie są faktycznie powłoka Bash, ale bieg wewnątrz niego (jak Drush , który jest Drupal CLI).

Oprócz eksportu rozszerzyliśmy go również: Pierwsza fraza PATH (PATH =) wykorzystała nas do dodania dodatkowej wartości (~ / .composer / vendor / bin :) do wartości oryginalnej (reprezentowanej przez $ PATH).

  • Dwukropek (:) na końcu nowej wartości, o której wspomniałem w powyższym akapicie, służy do odróżnienia nowej wartości od pierwotnej.

  • „” To obszar, w którym znajdują się wartości.

  • ~ To folder domowy.


Mam nadzieję, że po wykonaniu tego mapowania polecenie stanie się bardziej zrozumiałe dla studentów pierwszego roku, takich jak ja.

JohnDoea
źródło
1

exportKomenda powoduje zmienne dostępne w podpowłok. Oznacza to, że bez niego zmienna PATHnie byłaby widoczna w podpowłokach.

PATH jest wspomniany dwukrotnie:

  • Jako zmienna przypisywana jest wartość po lewej stronie =znaku.
  • Jako nazwę zmiennej zastępuje się jej wartością po prawej stronie =znaku. To sprawia, że ​​stara wartość jest częścią nowej wartości.
rexkogitans
źródło
1
„Oznacza to, że bez niego zmienna PATHnie byłaby widoczna w podpowłokach”. To jest niepoprawne; PATHjest zmienną środowiskową (która nie jest dokładnie tym samym co zmienna powłoki ), więc jest automatycznie eksportowana, a exportpolecenie jest niepotrzebne.
David
Rodzina powłok Bourne'a tak naprawdę nie rozróżnia zmiennych powłoki i środowiska. ( sc.tamu.edu/help/general/unix/vars.html ) W moim systemie (Arch Linux) bash nawet nie zna setenvpolecenia.
rexkogitans
1
Nadal istnieje różnica między zmiennymi środowiskowymi, o których jądro wie, a zmiennymi powłoki, które są wewnętrzne dla bash. Ponieważ PATHpochodzi ze środowiska, jest automatycznie eksportowany, więc nie trzeba uruchamiać, exportaby zmiany zostały propagowane do procesów potomnych (w przeciwieństwie do tego, co mówi strona, do której prowadzi łącze).
David
Zmienne środowiskowe nie są własnością jądra, ale procesu. Ponieważ proces, o którym tu mówimy, to sh, bash (czy Ubuntu używa zsh?), Myślę, że możemy pozostawić je równe zmiennym powłoki. Ale, oczywiście, zmienne powłoki nie są przekazywane do dowolnych programów losowych, podobnie jak zmienne środowiskowe.
rexkogitans
Myślę, że w tym momencie zagłębiamy się w semantykę. Wszystko, co próbowałem powiedzieć, to to, że w bash, PATH=fooi export PATH=foozachowują się identycznie.
David
0
export PATH="~/.composer/vendor/bin:$PATH"
  1. exportjest polecenie buildin bash, środki wyeksportować zmienne być zmienna envirement. (możesz wpisać, help exportaby pochylić się bardziej

    (znaki, które podążają za poleceniem to parametry, podzielone spacją, więc w tym przypadku jest tylko jeden parametr)

  2. PATHjest nazwa zmiennej, zwykle predefiniowane varibale przez bash, być nazwane w wielkich liter.

  3. =oznacza, przypisz wartość tej zmiennej.

  4. cały ciąg jest wartością zmiennej

  5. $PATHjest rodzajem funciton bash nazwie variable expantionbash zastąpi wartość exist PATHw łańcuchu parametrów, przed wysłaniem ciąg exportpolecenia

  6. :w spcial char na ścieżce zmiennej i understooded przez wszystkich aplikacji, które chcą skorzystać z tej zmiennej. oznacza separator. więc będą mieli wiele katalogów w zmiennej PATH.

uwielbia wiosnę
źródło