W jaki sposób Mac OS X ustawia wartość $ PATH?

12

Rozumiem, w jaki sposób można ustawić $ PATH, ale czy istnieje dokumentacja, która w pełni opisuje, gdzie Mac OS uzyskuje wszystkie ścieżki dołączane do $ PATH? Zdaję sobie sprawę z tego, jak /etc/profile, /etc/pathsi /etc/profile.d, ale czy istnieją inne skrypty, które ostatecznie wpływają na wartość $ PATH? Nie jestem też zbyt dobrze zaznajomiony z brakiem logowania i powłokami logowania ( .bashrc, .bash_profile), ale zdaję sobie sprawę z podstawowych różnic.

Psycho Punch
źródło

Odpowiedzi:

9

Zwykle twoja ŚCIEŻKA jest ustawiana przez powłokę. W przypadku Bash wszystko wyjaśniono w instrukcji . Możesz także otworzyć man bashi przejść do INVOCATIONczęści.

Wywoływany jako interaktywna powłoka logowania lub --login

Gdy Bash jest wywoływany jako interaktywna powłoka logowania lub jako nieinteraktywna powłoka z opcją --login, najpierw czyta i wykonuje polecenia z pliku / etc / profile, jeśli plik ten istnieje. Po odczytaniu tego pliku, szuka ~ / .bash_profile, ~ / .bash_login i ~ / .profile, w tej kolejności, i odczytuje i wykonuje polecenia z pierwszego, który istnieje i jest czytelny.

Wywoływany jako interaktywna powłoka niezalogowana

Po uruchomieniu interaktywnej powłoki, która nie jest powłoką logowania, Bash odczytuje i wykonuje polecenia z ~ / .bashrc, jeśli ten plik istnieje. Dodatkowo w OS X jest taki, path_helperktóry odczytuje zawartość /etc/paths.di dołącza je do twojej ścieżki.

Kluczem tutaj jest to, że w OS X Terminal domyślnie otwiera powłokę logowania, podczas gdy w Linuksie powłoki są zwykle uruchamiane jako powłoki niezalogowane. Josh Staiger ma dobre wytłumaczenie dla powłok logowania bez powłoki .

Są więc zasadniczo tylko te dwie trzy, w których można ustawić ścieżki:

  • /etc/profile(który wzywa path_helper)
  • /etc/pathsi /etc/paths.d(wywoływany z path_helper)
  • plik konfiguracyjny powłoki ( .bash_profile)
slhck
źródło
Dziękuję za zwięzłą i pouczającą odpowiedź. Więc chyba rozumiem, które skrypty / artefakty wpływają wtedy na $ PATH. Czy to oznacza, że /etc/profileskrypt jest używany głównie przez bash? Nie mam doświadczenia z innymi pociskami, ale zakładam, że mają inną strukturę?
Psycho Punch
/etc/profileJest używany przez większość (wszystkie? Nie w 100% pewien) muszli. Dlatego dobrym pomysłem jest umieszczenie w dowolnym miejscu rzeczy, które chcesz, takich jak ŚCIEŻKI. Bash czyta .bash_pliki, podczas gdy na przykład Zsh czyta .zshrcoprócz innych. To zależy od powłoki.
slhck
„Dodatkowo w OS X znajduje się ścieżka_ pomocnika, która odczytuje zawartość /etc/paths.d i dołącza je do twojej ścieżki.” Nie, niepath_helper jest wywoływany dla interaktywnych powłok niezalogowanych (ani nieinteraktywnych powłok). W rzeczywistości jest nazywany interaktywnymi powłokami logowania . /etc/profile
Maggyero
8

Ścieżki do /etc/pathsi /etc/paths.d/*są zwykle dodawane PATHprzez path_helper . path_helperjest uruchamiany z /etc/profile, więc jest uruchamiany, gdy bash jest wywoływany jako interaktywna powłoka logowania, ale nie jest uruchamiany, gdy bash jest wywoływany jako powłoka niezalogowana lub powłoka nieinteraktywna.

/etc/pathszawiera /usr/local/binna końcu domyślnie i /etc/paths.d/jest domyślnie pusty.

Terminal i iTerm 2 domyślnie otwierają nowe powłoki jako powłoki logowania, a powłoka otwierana podczas ssh na komputerze jest również powłoką logowania. Wiele emulatorów terminali na innych platformach tmuxoraz tryb powłoki w Emacsie otwierają jednak nowe powłoki jako powłoki niezalogowane.

Dodałem tę linię do /etc/launchd.conf:

setenv PATH ~/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/libexec:/usr/texbin

Zmienia wartość PATHuruchomionego procesu rootowania. Wartość jest dziedziczona przez wszystkie inne procesy, w tym procesy uruchomione przez użytkownika. Możesz zastosować zmiany /etc/launchd.conf, uruchamiając ponownie lub uruchamiając launchctl < /etc/launchd.conf; sudo launchctl < /etc/launchd.confi ponownie uruchamiając procesy.

W systemie OS X ~/.profilenie jest odczytywany po zalogowaniu graficznym. Jeśli oba istnieją ~/.bash_profilei ~/.profileistnieje, bash też nie czyta ~/.profile.

~/.MacOSX/environment.plist przestał działać w 10.8.

Lri
źródło