Wie genau wird PATH berechnet?

Ich habe ein Dutzend verschiedene Antworten gelesen und mit einer Reihe von Leuten gesprochen und habe Schwierigkeiten zu verstehen, wie PATH in verschiedenen Szenarien berechnet wird. Konkret denke ich an

  1. Wie genau wird PATH für bash berechnet?
  2. Wie genau wird es für andere Muscheln berechnet? (Ich gehe davon aus, dass es von der Shell abhängig ist, aber was ist die Gemeinsamkeit zwischen allen Shells?)
  3. Wie genau wird es für GUI-Apps berechnet?
  4. Übersehe ich eine andere Möglichkeit, Dinge zu starten? Machen Daemons etwas anderes? (Ich glaube nicht? Aber vielleicht...)

Außerdem bin ich jetzt auf High Sierra, aber ich sehe einige Leute, die erwähnt haben, dass sich dies irgendwann geändert hat?

Ich habe diese und diese Antwort gesehen, aber beide scheinen sich explizit darauf zu konzentrieren, was innerhalb von bash passiert.

Was meinen Sie mit dem Ausdruck „Wie wird PATH berechnet ?“. Es ist eine Umgebungsvariable, die festgelegt wird
@Allan ja aber wie genau ist das eingestellt? Es ist nicht nur .bash_profilezum Beispiel so, weil PATH zu dem Zeitpunkt, an dem die Zeit läuft, bereits Dinge enthält (deshalb fügen wir vorne oder hinten hinzu). Es wird berechnet, indem eine Reihe von Quellen berücksichtigt und eine Reihe von Skripten ausgeführt werden, aber was sind das ?
Ich stimme dafür, diese Frage als zu breit zu schließen. Bitte bearbeiten Sie die Frage, um sie auf ein bestimmtes Problem mit genügend Details zu beschränken, um eine angemessene Antwort zu finden. Vermeiden Sie es, mehrere unterschiedliche Fragen gleichzeitig zu stellen.
@user3439894 Würden Sie empfehlen, jede dieser Fragen als separate Frage zu stellen? Denn das scheint eine massive Überschneidung zu sein und einige der Antworten sind wahrscheinlich identisch.
Es ist in der Tat eine sehr weit gefasste Frage. Aber hier sind ein paar Hinweise: Bash und andere Shells im Bourne-Stil sowie csh und verwandte Shells würden verwendet, path_helperum die PATH-Variable zu setzen. Sehen Sie sich die Handbuchseite an; Sie werden feststellen, dass sie lesen /etc/pathsund /etc/paths.d/*für den Inhalt. Benutzer anderer Shells sind gut beraten, diese Methode anzupassen; Auf diese Weise erhalten alle Shells denselben PATH.

Antworten (3)

Ich werde 1 & 2 zusammenfassen, weil alle Shells Dateien beim Start lesen.

PATH wird von seinem übergeordneten Prozess geerbt. Dies ist ein Schlüsselkonzept, das Sie verstehen müssen.

Der PATH wird zuerst fest in den Kernel codiert:

sysctl user.cs_path
user.cs_path: /usr/bin:/bin:/usr/sbin:/sbin

launchd, das so funktioniert, initkann konfiguriert werden, um diesen PATH zu ändern. Im Allgemeinen wird es nicht geändert.

Die loginwindow.app richtet eine Umgebung ein, wenn Sie sich bei Ihrem Computer anmelden. PATH wird überprüft, ob es gesetzt wurde, oder es wird auf den hartcodierten Pfad im Kernel oder einen modifizierten Pfad gesetzt, der von launchd gesetzt wurde. Es ist, als würde die loginwindow.app anrufen login -pf <username>.

An diesem Punkt kann ein Benutzer LaunchAgent oder LaunchDaemon den PATH ändern.

Dies ist der PFAD, der GUI-Anwendungen im Finder zur Verfügung steht. (Frühere Versionen von OS X konnten ~/.MacOSX/environment.plist verwenden, um den PFAD für GUI-Anwendungen zu ändern). Nun, wenn dies kompliziert erscheint, ist es nicht und wahrscheinlicher, wie ich, der PATH verfügbar ist/usr/bin:/bin:/usr/sbin:/sbin

Wenn Sie die Terminal.app starten, ruft sie zuerst login(login -pf ) auf, was dazu führt, dass Ihre Shell als Login-Shell behandelt wird. Die entsprechenden Dateien in /etc und Ihrem HOME-Ordner werden gelesen. Jetzt sollte PATH anders sein als von der loginwindow.app festgelegt. Erinnerst du dich, dass wir über Erbschaft gesprochen haben? Wenn Sie eine GUI-App von Ihrer Terminalsitzung aus starten, ist der für die GUI-Anwendung verfügbare PATH derselbe wie von der Shell festgelegt.

Daemons werden normalerweise mit ihrem absoluten Pfad gestartet.

Vielen Dank für die verdammte Erklärung, wie launchd in all das passt! Niemand sonst konnte es mir sagen!
Launched ist nur ein weiterer Prozess und funktioniert wie alle anderen. Es erbt eine Umgebung und legt eine Umgebung für Prozesse fest, die es verzweigt.

Aus der Manpage für PATH ( man path):

Der Suchpfad für Befehle. Es ist eine durch Doppelpunkte getrennte Liste von Verzeichnissen, in denen die Shell nach Befehlen sucht (siehe BEFEHLSAUSFÜHRUNG weiter unten).... Der Standardpfad ist systemabhängig und wird vom Administrator festgelegt, der Bash installiert. Ein häufiger Wert ist ``/usr/gnu/bin:/usr/local/bin:/usr/ucb:/bin:/usr/bin''.

Abgesehen von der Bash-Manpage sehen wir also, dass der Bash-Pfad (zunächst) so lautet:

  • systemabhängig und nicht Shell-abhängig
  • gesetzt von demjenigen, der bash installiert hat (in diesem Fall Apple)
  • hat einen Standardwert

Der Pfad kann (offensichtlich) geändert werden. Es gibt mehrere Stellen, an denen die Umgebungsvariable PATH gesetzt werden kann:

  • ~/.bashrc
  • ~/.bash_profile

In macOS wird die Datei /etc/pathsverwendet, um die Suchpfade zu konfigurieren:

/usr/local/bin
/usr/bin
/bin
/usr/sbin
/sbin

Außerdem wird der Pfad anfänglich durch das Dienstprogramm konfiguriert, /usr/libexec/path_helperdas einen Pfad basierend auf dem Inhalt von erstellt/etc/paths.d

Es wird aufgerufen, von /etc/profiledem aus das systemweite Bash-Profil festgelegt wird (individuelle werden in festgelegt ~/.profile) .

Bei GUI-Apps hat der Shell-Pfad wirklich keine Auswirkung. Das einzige Mal, wenn eine GUI-Anwendung (Cocoa, Quartz, Metal) irgendetwas mit PATH zu tun hat, ist, wenn sie eine Shell öffnet (entweder interaktiv oder nicht interaktiv). An diesem Punkt wird es die PATH-Umgebung wie festgelegt verwenden oder alle erforderlichen Änderungen zur Laufzeit vornehmen.

Verschiedene Muscheln

Jede der Shells hat ein anderes systemweites Profil (wie bash), das den anfänglichen PATH festlegt (durch Aufrufen des path_helperDienstprogramms).

  • Zsh =/etc/zprofile
  • Ksch =/etc/profile
  • Tsch =/etc/csh.login
Ja, aber nicht alles wird über Bash gestartet, oder? Wenn ich eshell in Emacs oder Korn Shell ausführe, wird es nicht denselben Prozess durchlaufen. Mir ist klar, dass es pro Shell unterschiedlich sein wird, aber ist es völlig anders oder bietet das Betriebssystem eine "gemeinsame Initialisierungsbasis"? Was ist mit Apps, die über Spotlight gestartet werden? Wie wird der PATH berechnet, den sie sehen?
Terminologie ist wichtig - der Pfad wird nicht berechnet. Es steht fest. Sie verwechseln OS mit Shell. Eine Shell ist nichts anderes als eine Umgebung zum Ausführen von Befehlen in einem Betriebssystem.
Fair genug, Allan, ich bin mir jedoch nicht sicher, welchen anderen Begriff ich verwenden soll. Der Pfad ist tatsächlich festgelegt (aus Sicht der Skripte), aber aus Sicht einer Anwendung, die den PATH verwenden könnte, gab es eine Reihe von Schritten, die durchgeführt wurden, um die aktuelle PATH-Umgebungsvariable zu erzeugen. Bei GUI-Apps unterscheidet sich die Nichtverwendung des PATH davon, dass er nicht verfügbar ist. Sie können system attribute PATHoder etwas in AppleScript tun, oder? Der Wert, den ich dort sehe ... wo kommt er her? Welche Reihe von Schritten hat das Betriebssystem durchlaufen, um es einzustellen?
Das klingt immer mehr nach einem XY-Problem . Was ist das Problem, auf das Sie stoßen, weil für AppleScript kein Shell-Pfad festgelegt sein muss?
Irgendwie .. Ich habe nicht wirklich ein Problem (naja, das habe ich, und sein pyenv wird nicht richtig installiert, aber ich kann das herausfinden, wenn ich ein grundlegendes Verständnis habe), ich suche nach einem tieferen Verständnis dafür, wie dieses Zeug funktioniert, nicht nach Lösungen für alles Konkrete.
Aus diesem Grund wird es als zu breit gekennzeichnet (ich habe es nicht). Das erste, was Sie sich ansehen sollten, ist das Bash-Referenzhandbuch , das Ihnen eine gute Einführung in die Funktionsweise dieses Zeugs gibt.
Haha, ich verstehe es und ich schätze den Versuch, es zu beantworten. Der Bash-Prozess für die Konstruktion von PATH ist eigentlich das Bit, an dem ich am wenigsten interessiert bin, da das ziemlich gut dokumentiert ist, wie Sie sagen. Es sind die anderen Dinge (wie was GUI-Apps sehen oder was mein Eshell-Profil sehen wird), die mich verwirren

Alle: Bitte haben Sie Verständnis dafür, dass Apple das Pfadparadigma im Laufe der Zeit in Sierra (siehe https://lluad.com/blog/os-x-system-path/ ), HighSierra und Mojave geändert hat. Path_helper funktioniert jetzt anscheinend etwas anders, weil es Terminalfenster für mich gesperrt hat, die ich durch Auskommentieren freigeben und gut funktionieren lassen kann

# if [ -x /usr/libexec/path_helper ]; then
#   eval `/usr/libexec/path_helper -s`
#  fi

im /etc/profile.

Ich habe Skripte, die den Pfad reparieren, weil ich mehrere Tools habe (der Kern davon wird von Homebrew installiert, aber das sind nur etwa 15 der 25, die ich jeden Tag verwende) und diese müssen für die Verwendung in .app eingestellt werden Anwendungen, in .sh-Skriptstarts und für den automatischen Start in geschützter Boot-Sequenz unter Mojave. Es ist verwirrend, aber sicher hat Mojave die erforderliche Struktur geändert und ich muss sie selbst verbessern.

Für diese spezielle Frage bedeutet dies, dass die Frage in ihrer ganzen Breite relevant ist und von Entwicklern beantwortet werden muss, die den Schmerz gespürt und ihre Systeme für Mojave repariert haben und auch aus den verschiedenen „Welten“ kommen, wie normale IDEs , XCode, Eclipse, Bean, Intellij usw. Auch diejenigen, die auf Homebrew-Stacks oder Mamp-Stacks usw. angewiesen sind. Und für diejenigen, die mit Docker, .node, vm usw. und anderen tieferen Tools arbeiten. Wenn Apple mehr Sicherheit implementiert, werden unsere Sachen kaputt gehen, aber ich bin froh, dass Apple seinen Job macht. Wir müssen unsere tun, also brauchen wir führende Leute, um die neue Weisheit weiterzugeben. Artikel, die 6 oder mehr Monate alt sind, werden uns nur verwirren.

Irgendwie scheint das die oben gestellte Frage nicht zu beantworten. Wenn sich die Antwort auf der von Ihnen verlinkten Seite befindet, fassen Sie sie bitte direkt in Ihrem Beitrag zusammen (und kürzen Sie möglicherweise die späteren Absätze). Erwähne auch nicht nur, dass du Dinge anders machst, sondern erkläre/zeige auch, wie du es machst.