Wie setzt Mac OS X den Wert von $ PATH?

11

Ich habe ein grundlegendes Verständnis dafür, wie $ PATH festgelegt werden kann. Gibt es jedoch eine Dokumentation, in der vollständig beschrieben wird, woher Mac OS alle Pfade bezieht, die an $ PATH angehängt werden? Ich kenne Dinge wie /etc/profile, /etc/pathsund /etc/profile.d, aber gibt es andere Skripte, die sich letztendlich auf den Wert von $ PATH auswirken? Ich bin auch nicht sehr vertraut zwischen den Nicht-Login- und Login-Shells ( .bashrc, .bash_profile), aber ich bin mir der grundlegenden Unterschiede bewusst.

Psycho Punch
quelle

Antworten:

9

Normalerweise wird Ihr PFAD von der Shell festgelegt. Für Bash wird alles im Handbuch erklärt . Sie können man bashdas INVOCATIONTeil auch öffnen und überspringen .

Wird als interaktive Login-Shell oder mit --login aufgerufen

Wenn Bash als interaktive Anmeldeshell oder als nicht interaktive Shell mit der Option --login aufgerufen wird, werden zuerst Befehle aus der Datei / etc / profile gelesen und ausgeführt, sofern diese Datei vorhanden ist. Nach dem Lesen dieser Datei wird in dieser Reihenfolge nach ~ / .bash_profile, ~ / .bash_login und ~ / .profile gesucht und Befehle von der ersten vorhandenen und lesbaren gelesen und ausgeführt.

Wird als interaktive Shell ohne Anmeldung aufgerufen

Wenn eine interaktive Shell gestartet wird, die keine Anmeldeshell ist, liest Bash Befehle von ~ / .bashrc und führt sie aus, sofern diese Datei vorhanden ist. In OS X gibt es außerdem eine, path_helperdie den Inhalt von liest /etc/paths.dund diese an Ihren Pfad anfügt.

Der Schlüssel hierbei ist, dass das Terminal unter OS X standardmäßig eine Anmeldeshell öffnet, während unter Linux Shells normalerweise als Nicht-Anmeldeshells gestartet werden. Josh Staiger hat eine gute Erklärung für Login und Nicht-Login-Shells .

Es gibt also im Wesentlichen nur diese beiden drei, in denen Sie Pfade festlegen können:

  • /etc/profile(was anruft path_helper)
  • /etc/pathsund /etc/paths.d(angerufen von path_helper)
  • Ihre Shell-Konfigurationsdatei ( .bash_profile)
slhck
quelle
Vielen Dank für die prägnante und informative Antwort. Ich verstehe also irgendwie, welche Skripte / Artefakte dann den $ PATH beeinflussen. Bedeutet dies also, dass /etc/profilees sich um ein Skript handelt, das hauptsächlich von Bash verwendet wird? Ich habe keine Erfahrungen mit anderen Muscheln, aber ich gehe davon aus, dass sie einer anderen Struktur folgen.
Psycho Punch
Das /etc/profilewird von den meisten (alle? Nicht 100% sicher) Muscheln verwendet. Deshalb ist es eine gute Wahl, Dinge, die Sie wollen, überall hinein zu legen, wie z. B. PFADE. Bash liest .bash_Dateien, während Zsh beispielsweise .zshrczusätzlich zu anderen liest . Es kommt auf die Schale an.
Slhck
"In OS X gibt es außerdem path_helper, der den Inhalt von /etc/paths.d liest und an Ihren Pfad anfügt." Nein, path_helperwird nicht für interaktive Nicht-Login-Shells (oder nicht interaktive Shells) aufgerufen. Es wird eigentlich für interaktive Login-Shells aufgerufen /etc/profile.
Maggyero
8

Die Pfade in /etc/pathsund /etc/paths.d/*werden normalerweise PATHvon path_helper hinzugefügt . path_helperwird von ausgeführt /etc/profile, wird also ausgeführt, wenn bash als interaktive Anmeldeshell aufgerufen wird, nicht jedoch, wenn bash als nicht angemeldete Shell oder nicht interaktive Shell aufgerufen wird.

/etc/pathsenthält /usr/local/binstandardmäßig am Ende und /etc/paths.d/ist standardmäßig leer.

Terminal und iTerm 2 öffnen standardmäßig neue Shells als Login-Shells, und die Shell, die beim SSH auf Ihrem Computer geöffnet wird, ist auch eine Login-Shell. Viele Terminalemulatoren auf anderen Plattformen tmuxund der Shell-Modus in Emacs öffnen jedoch neue Shells als Nicht-Login-Shells.

Ich habe diese Zeile hinzugefügt zu /etc/launchd.conf:

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

Es ändert den Wert des PATHRoot-Startprozesses. Der Wert wird von allen anderen Prozessen geerbt, einschließlich der pro Benutzer gestarteten Prozesse. Sie können Änderungen anwenden, /etc/launchd.confindem Sie neu starten oder launchctl < /etc/launchd.conf; sudo launchctl < /etc/launchd.confProzesse ausführen und neu starten.

Wird unter OS X ~/.profilenicht gelesen, wenn Sie sich grafisch anmelden. Wenn beides ~/.bash_profileund ~/.profileexistiert, liest bash auch nicht ~/.profile.

~/.MacOSX/environment.plist hat in 10.8 aufgehört zu arbeiten.

Lri
quelle