Pełny widok miejsca, w którym zmienna PATH jest ustawiona w bash

17

Przeczytałem w kilku miejscach, w których PATHjest ustawiony plik /etc/profilelub .profileplik w katalogu domowym.

Czy to jedyne miejsca, w których ścieżka jest ustawiona? Chcę to lepiej zrozumieć.

W /etc/profilepliku, jak mówi następujący komentarz "system-wide .profile file for the Bourne shell". Czy to oznacza, że ​​pliki profilów są głównymi plikami konfiguracyjnymi dla bash?

W tym pliku w ogóle nie widzę PATHvar. W .profilepliku w katalogu domowym znajduje się następujący wiersz:

PATH="$HOME/bin:$PATH"

To zresetuje PATHsię po wyglądzie, ponieważ łączy on już ustawiony $PATHciąg z $HOME/bin:prawdą? Ale jeśli etc/profilei ~/.profilesą tylko pliki ustawień PATH, gdzie jest $PATHpochodzących z w tej linii kodu, jeśli to nie jest zdefiniowane w /etc/profile?

Czy ktoś doświadczony może podać obszerne i szczegółowe wyjaśnienie PATHzmiennej? Dzięki!

Larry Lawless
źródło

Odpowiedzi:

20

Istnieje wiele miejsc, w których PATHmożna ustawić.

loginProgram ustawia go na wartość domyślną. Sposób skonfigurowania tej wartości domyślnej zależy od systemu. W większości niewbudowanych systemów Linux jest pobierany /etc/login.defsz różnymi wartościami dla roota i dla innych użytkowników. Zapoznaj się z login(1)instrukcją obsługi systemu, aby dowiedzieć się, co on robi.

W systemach korzystających z PAM , w szczególności pam_envmodułu, zmienne środowiskowe można ustawić w pliku systemowym /etc/environmenti pliku użytkownika ~/.pam_environment.

Następnie większość sposobów logowania (ale nie zadań cron) wykonuje powłokę logowania, która odczytuje pliki konfiguracyjne dla całego systemu i dla poszczególnych użytkowników. Pliki te mogą modyfikować wartość PATH, zazwyczaj w celu dodania wpisów, ale czasami w inny sposób. Odczytane pliki zależą od powłoki logowania. Powłoki w stylu Bourne / POSIX odczytują /etc/profilei ~/.profile. Bash czyta /etc/profile, ale dla pliku użytkownika odczytuje tylko pierwszy istniejący plik spośród ~/.bash_profile, ~/.bash_logini ~/.profile. Zsh czyta /etc/zshenv, ~/.zshenv, /etc/zprofile, ~/.zprofile, /etc/zlogini ~/.zlogin. Wiele sesji GUI zorganizować, aby załadować /etc/profilei ~/.profile, ale to zależy od menedżera wyświetlania na środowisko pulpitu lub innego skryptu startowego sesji, i jak każda dystrybucja ma je skonfigurować.

Gilles „SO- przestań być zły”
źródło
4

Początkowa zmienna PATH jest zwykle ustawiana w. /etc/profile Czasami administrator sys również umieści zmienne PATH w źródle/etc/profile.d

Są to zmienne systemowe ŚCIEŻKA, które domyślnie dziedziczy każdy zalogowany (chyba że lokalnie są one zastępowane). Zazwyczaj wyznacza to oczywiste ścieżki, na przykład /usr/bin, chociaż w mojej pracy używamy /opti kilka niestandardowych lokalizacji, więc one również tam są.

W przypadku kont logowania dla poszczególnych użytkowników, PATH może być również zdefiniowane w ~/.profile. To może definiować rzeczy, do których nie wszyscy użytkownicy mają dostęp; może szefowie działów mogą uruchamiać pliki binarne, /optale inni użytkownicy nie przejmują się tymi plikami binarnymi. Użytkownicy mogą również modyfikować ten plik, a miłą rzeczą .profilejest to, że nie jest on specyficzny dla powłoki; jeśli się zalogujesz, zestaw PATH zostanie tam pobrany.

Dla danej powłoki logowania, ścieżka może być zdefiniowana w ~/.bash_profile, ~/.bashrclub .cshrc, lub podobne. Użytkownicy mogą ustawić PATH tutaj, jeśli chcą określonych ścieżek dla określonych powłok lub jeśli akurat zachowują wszystkie swoje osobiste preferencje.

Podsumowując: / etc / profile i /etc/profile.d są tradycyjnie ustawieniami kaskadowymi; są dziedziczone i zwykle dodawane są do osobistych plików kropek (chociaż użytkownik może zamiast tego je zastąpić). Osobiste pliki kropek są zwykle ustawiane przez użytkownika.

Oczywiście powłoka ma również zmienne środowiskowe, więc lokalna zmienna środowiskowa może również dodawać lub zastępować domyślną ŚCIEŻKĘ w dowolnym pliku konfiguracyjnym.

Klaatu von Schlacker
źródło
Właśnie sprawdziłem wszystkie wymienione pliki, ~ / .bash_profile i .cshrc nie istnieją jednak. 3 pliki skryptów w /etc/profile.d katalog: appmenu-qt5.sh, bash_completion.sh i vte.sh również nie ustawiają zmiennej PATH. Co masz na myśli mówiąc, że „powłoka ma również zmienne środowiskowe” to domyślna ŚCIEŻKA ustawiona w programie binarnym / bin / bash? Kiedy terminal echa $ PATH otrzymuję: / usr / local / sbin: / usr / local / bin: / usr / sbin: / usr / bin: / sbin: / bin: / usr / games: / usr / local / games ale nie mam pojęcia, gdzie to wszystko się naprawdę dzieje.
Larry Lawless
Myślę, że nieco źle odczytałem twoje pytanie, myślałem, że pytasz o wszystkie lokalizacje PATH, które można ustawić, ale myślę, że bardziej interesuje cię, gdzie PATH jest początkowo ustawione. W tym celu spójrz na /etc/bashrc. Określa to, w jaki sposób uruchamiany jest BASH, który powinien obejmować wszystkie początkowe zmienne środowiskowe. W moim systemie /etc/bashrcczyta z, /etc/profile.dale wygląda na to, że masz tylko 3 pliki, /etc/profile.dwięc Twoja dystrybucja może robić to inaczej.
Klaatu von Schlacker,
1
Zasadniczo chcę poznać jego tajniki. Chciałbym, żeby Ken Thompson był moim ojcem :)
Larry Lawless
Dotrzesz tam. Uwierz mi, po codziennym korzystaniu z tych rzeczy wszystko zaczyna się zapadać i dopóki pytasz „dlaczego?” i czytając dokumenty w poszukiwaniu odpowiedzi, w końcu dużo się uczysz!
Klaatu von Schlacker
W Linux Mint 18 Cinnamon koniecznie sprawdź /etc/profile.d/jdk_home.sh Zmieniłem nazwę tego pliku na jdk_home.sh.old i teraz moja ścieżka nie jest ciągle zastępowana i mogę wywołać wersję java i zobaczyć Java 9 jako spodziewany. Mimo że poprawnie wybrałem Java 9 w update-aternatives --config java ten plik jdk_home.sh nadal nadpisywał $ PATH
flyingdrifter
3

Aby dodać do innych odpowiedzi:

bashustawi PATHstałą wartość domyślną, jeśli nie jest ustawiona w środowisku. Na komputerze z Ubuntu Server 16.04.2 otrzymuję:

$ env -i bash -c 'echo $PATH'
/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:.

Możemy sprawdzić, czy ta wartość jest rzeczywiście zakodowana na stałe i nie jest odczytywana ze środowiska lub jakiegoś pliku, za pomocą stringsnarzędzia:

$ strings /bin/bash | grep /usr/sbin
/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:.

Otrzymuję jednak inny wynik na moim komputerze Arch Linux:

$ env -i bash -c 'echo $PATH'
/usr/local/sbin:/usr/local/bin:/usr/bin

Wygląda więc na to, że ta domyślna wartość jest wybierana w momencie bashbudowania pliku binarnego, co zależy od używanego systemu operacyjnego / dystrybucji.

Vladimir Panteleev
źródło