Vollständige Ansicht, wo die PATH-Variable in Bash gesetzt ist

16

Ich habe an ein paar Stellen gelesen, dass das eingestellt PATHist, /etc/profileoder die .profileDatei, die sich im Hauptverzeichnis befindet.

Sind dies die einzigen Orte, an denen der Pfad festgelegt ist? Ich möchte es besser verstehen.

In der /etc/profileDatei heißt es wie im folgenden Kommentar "system-wide .profile file for the Bourne shell". Bedeutet das, dass Profildateien die Hauptkonfigurationsdateien für bash sind?

In dieser Datei wird die Variable überhaupt nicht PATHangezeigt. In der .profileDatei im Home-Verzeichnis steht diese Zeile:

PATH="$HOME/bin:$PATH"

Das wird PATHdurch das Aussehen zurückgesetzt, weil es den bereits gesetzten $PATHString mit $HOME/bin:rechts verkettet . Aber ob etc/profileund woher ~/.profilekommen die einzigen Dateien in dieser Codezeile, wenn sie nicht in definiert sind ?PATH$PATH/etc/profile

Kann jemand erfahren, bitte geben Sie eine breite und detaillierte Erklärung der PATHVariablen? Vielen Dank!

Larry Lawless
quelle

Antworten:

18

Es gibt viele Stellen, an denen eingestellt werden PATHkann.

Das loginProgramm setzt es auf einen Standardwert. Wie dieser Standardwert konfiguriert wird, ist systemabhängig. Auf den meisten nicht eingebetteten Linux-Systemen wird es /etc/login.defsmit unterschiedlichen Werten für root und für andere Benutzer verwendet. Konsultieren Sie das login(1)Handbuch auf Ihrem System, um herauszufinden, was es tut.

Auf Systemen, die PAM , insbesondere das pam_envModul, verwenden, können Umgebungsvariablen in der systemweiten Datei /etc/environmentund der benutzerspezifischen Datei festgelegt werden ~/.pam_environment.

Die meisten Anmeldemethoden (jedoch keine Cron-Jobs) führen eine Anmeldeshell aus, die systemweite und benutzerspezifische Konfigurationsdateien liest. Diese Dateien können den Wert von ändern PATH, normalerweise um Einträge hinzuzufügen, manchmal aber auch auf andere Weise. Welche Dateien gelesen werden, hängt von der Login-Shell ab. Bourne / POSIX-artige Shells lesen /etc/profileund ~/.profile. Bash liest /etc/profile, aber für die pro-User - Datei liest nur die erste vorhandene Datei unter ~/.bash_profile, ~/.bash_loginund ~/.profile. Zsh liest /etc/zshenv, ~/.zshenv, /etc/zprofile, ~/.zprofile, /etc/zloginund ~/.zlogin. Viele GUI - Sitzungen organisieren zu laden /etc/profileund ~/.profile, aber das hängt von dem Display - Manager auf der Desktop - Umgebung oder anderen Sitzungsstartskript, und wie jede Verteilung diese nach oben gesetzt hat.

Gilles 'SO - hör auf böse zu sein'
quelle
4

Die anfängliche PATH-Variable wird normalerweise in festgelegt. /etc/profile Manchmal legt ein Sys-Administrator auch PATH-Variablen zur Quelle in fest/etc/profile.d

Dies sind die System-PATH-Variablen, die jeder, der sich anmeldet, standardmäßig erbt (sofern sie nicht lokal überschrieben werden). Dies legt normalerweise offensichtliche Pfade fest, zum Beispiel /usr/bin, obwohl wir bei meiner Arbeit /opteinige benutzerdefinierte Pfade verwenden , so dass diese auch dort festgelegt werden.

Bei benutzerspezifischen Anmeldekonten kann PATH auch in definiert werden ~/.profile. Das könnte Dinge definieren, auf die nicht alle Benutzer Zugriff haben. Vielleicht können Abteilungsleiter Binärdateien ausführen, /optaber andere Benutzer kümmern sich nicht um diese Binärdateien. Benutzer können diese Datei auch selbst ändern, und das Schöne daran .profileist, dass sie nicht Shell-spezifisch ist. Wenn Sie sich anmelden, wird der dort eingestellte Pfad bezogen.

Für Shell-spezifische Logins, PATH kann definiert werden in ~/.bash_profile, ~/.bashrc, oder .cshrc, oder ähnlichem. Benutzer können hier PATH einstellen, wenn sie bestimmte Pfade für bestimmte Shells wünschen oder wenn sie nur all ihre persönlichen Präferenzen dort beibehalten.

Zusammenfassend: / etc / profile und /etc/profile.d sind traditionell kaskadierende Einstellungen. Sie werden vererbt und normalerweise in persönlichen Punktedateien hinzugefügt (obwohl ein Benutzer sie auch überschreiben kann). Persönliche Punktedateien werden normalerweise von einem Benutzer festgelegt.

Natürlich hat eine Shell auch Umgebungsvariablen, so dass eine lokale Umgebungsvariable auch Standard-PATH in jeder Konfigurationsdatei hinzufügen oder überschreiben kann.

Klaatu von Schlacker
quelle
Ich habe gerade alle Dateien überprüft, die Sie erwähnt haben. ~ / .Bash_profile und .cshrc existieren jedoch nicht. Die 3 Skriptdateien im Verzeichnis /etc/profile.d: appmenu-qt5.sh, bash_completion.sh & vte.sh setzen auch nicht die Variable PATH. Was meinst du mit "eine Shell hat auch Umgebungsvariablen" ist der Standard-PATH, der im Programm binary / bin / bash gesetzt ist? Wenn ich $ PATH als Echo begebe, erhalte ich: / usr / local / sbin: / usr / local / bin: / usr / sbin: / usr / bin: / sbin: / bin: / usr / games: / usr / local / games aber ich habe keine Ahnung, wo das alles wirklich eingestellt wird.
Larry Lawless
Ich glaube, ich habe Ihre Frage etwas falsch verstanden, ich dachte, Sie fragen nach allen Orten, an denen PATH gesetzt werden könnte, aber ich denke, Sie interessieren sich mehr dafür, wo PATH anfänglich gesetzt wird. Schauen Sie sich das an /etc/bashrc. Hiermit wird festgelegt, wie BASH gestartet wird, das alle anfänglichen Umgebungsvariablen enthalten soll. Auf meinem System wird von /etc/bashrcgelesen, /etc/profile.daber es hört sich so an, als hätten Sie nur 3 Dateien in /etc/profile.dder Distribution, sodass Ihre Distribution dies möglicherweise anders macht.
Klaatu von Schlacker
1
Grundsätzlich möchte ich die Vor- und Nachteile kennen. Ich wünschte Ken Thompson wäre mein Vater :)
Larry Lawless
Du wirst dahin kommen. Glaub mir, nachdem du dieses Zeug eine Weile täglich benutzt hast, fängt alles an zu sinken und solange du fragst "warum?" Wenn Sie die Antworten in den Dokumenten lesen, werden Sie mit der Zeit viel lernen!
Klaatu von Schlacker
In Linux Mint 18 Cinnamon muss /etc/profile.d/jdk_home.sh überprüft werden. Ich habe diese Datei in jdk_home.sh.old umbenannt. Jetzt wird mein Pfad nicht mehr überschrieben und ich kann Java-Version aufrufen und Java 9 als sehen erwartet. Obwohl ich Java 9 in update-aternatives --config java korrekt ausgewählt habe, überschrieb diese jdk_home.sh-Datei den $ PATH
flyingdrifter
3

So ergänzen Sie die anderen Antworten:

bashwird PATHauf einen fest codierten Standardwert gesetzt, wenn dieser nicht in der Umgebung eingestellt ist. Auf einem Ubuntu Server 16.04.2-Computer erhalte ich:

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

Mit dem folgenden stringsDienstprogramm können wir überprüfen, ob dieser Wert tatsächlich fest codiert ist und nicht aus der Umgebung oder einer Datei gelesen wird :

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

Auf meinem Arch Linux-Computer erhalte ich jedoch ein anderes Ergebnis:

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

Es sieht also so aus, als wäre diese Standardeinstellung zum Zeitpunkt der bashErstellung der Binärdatei ausgewählt, was vom verwendeten Betriebssystem / der verwendeten Distribution abhängt.

Vladimir Panteleev
quelle
0

Sachen, die ich nicht sehe:

  • X Zeug
  • Masterdateien, von denen .profileusw. bei der Kontoerstellung kopiert werden
  • pam_env
  • Ein neuer Thread über Debian , in dem dies ausführlich diskutiert wird.

Ken Thompson mag Sie überraschen: "Views on Linux" .

Rusi
quelle