So fügen Sie Ihrem $PATH unter Linux ein Verzeichnis hinzu

Die Umgebungsvariable $PATH ist ein unauffälliger, aber wichtiger Bestandteil Ihres Linux-Systems. Sie beeinflusst Ihre tägliche Arbeit, ohne dass Sie es direkt bemerken. Wir erklären, wie sie funktioniert und wie Sie sie an Ihre Bedürfnisse anpassen können.

Was ist $PATH in Linux und wie funktioniert es?

Jedes Mal, wenn Sie einen Befehl in Ihr Terminal eingeben und mit der Eingabetaste bestätigen, werden viele Prozesse im Hintergrund angestoßen, noch bevor Ihr Befehl ausgeführt wird.

Die Bash, die in den meisten Linux-Distributionen als Standard-Shell verwendet wird, interpretiert die von Ihnen eingegebene Textzeile. Sie identifiziert Befehlsnamen, Parameter, Pipes, Umleitungen und andere Elemente. Anschließend sucht sie nach den entsprechenden ausführbaren Dateien für diese Befehle und führt sie mit den von Ihnen angegebenen Parametern aus.

Der erste Schritt der Shell bei der Suche nach einer ausführbaren Datei ist die Überprüfung, ob überhaupt eine Binärdatei beteiligt ist. Wenn der von Ihnen verwendete Befehl ein „Shell-Builtin“ ist, also direkt in die Shell integriert ist, ist keine weitere Suche erforderlich.

Shell-Builtins sind leicht zu finden, da sie ein fester Bestandteil der Shell sind, wie Werkzeuge in einem Werkzeuggürtel – immer griffbereit.

Wenn Sie jedoch ein externes Werkzeug benötigen, müssen Sie in der Werkstatt danach suchen. Befindet es sich auf der Werkbank oder an der Wand? Genau das leistet die Umgebungsvariable $PATH: Sie enthält eine Liste der Verzeichnisse, die die Shell durchsucht, sowie die Reihenfolge, in der dies geschieht.

Um herauszufinden, ob ein Befehl ein Shell-Builtin, ein Alias, eine Funktion oder eine eigenständige Binärdatei ist, können Sie den Befehl `type` verwenden:

type clear
type cd

Dies zeigt, dass `clear` eine Binärdatei ist, die sich in `/usr/bin` befindet. Möglicherweise gibt es auf Ihrem System mehrere Versionen von `clear`, aber die Shell verwendet die zuerst gefundene.
Es überrascht nicht, dass `cd` ein Shell-Builtin ist.

Anzeigen Ihres $PATH

Es ist einfach, den Inhalt Ihrer $PATH-Variablen einzusehen. Verwenden Sie den Befehl `echo` und geben Sie den Wert der Variablen `$PATH` aus:

echo $PATH

Die Ausgabe ist eine Liste von Dateisystempfaden, die durch Doppelpunkte (:) getrennt sind. Die Shell durchsucht diese Pfade von links nach rechts nach einer passenden ausführbaren Datei für Ihren Befehl.

Hier ist eine beispielhafte Auflistung der durchsuchten Dateisystempfade und ihrer Reihenfolge:

/usr/local/sbin
/usr/local/bin
/usr/sbin
/usr/bin
/sbin
/bin
/usr/games
/usr/local/games
/snap/bin

Es ist wichtig zu wissen, dass die Suche nicht im aktuellen Arbeitsverzeichnis beginnt, sondern sich durch die aufgelisteten Verzeichnisse arbeitet. Wenn Ihr aktuelles Arbeitsverzeichnis nicht in der $PATH-Variable enthalten ist, wird es bei der Suche nach Befehlen ignoriert.

Um dies zu demonstrieren, haben wir ein kleines Programm namens `rf` erstellt. Bei Ausführung gibt `rf` den Namen des Verzeichnisses aus, aus dem es gestartet wurde. Es befindet sich in `/usr/local/bin`. Eine neuere Version befindet sich in `/dave/work`.

Der Befehl `which` zeigt uns, welche Version unseres Programms die Shell findet und verwendet:

which rf

Die Shell zeigt, dass die Version in `/usr/local/bin` gefunden wurde.

Beim Ausführen des Befehls `rf` sehen wir:

rf

Version 1.0 von `rf` wird ausgeführt und bestätigt, dass unsere Erwartungen korrekt waren. Die gefundene und ausgeführte Version befindet sich in `/usr/local/bin`.

Um eine andere Version von `rf` auszuführen, müssen wir den Pfad zur ausführbaren Datei explizit angeben:

./work/rf

Nun verwendet die Shell Version 1.1. Wenn wir diese Version bevorzugen, könnten wir sie nach `/usr/local/bin` kopieren und die alte Version ersetzen.

Nehmen wir an, wir entwickeln eine neue Version von `rf` und müssen sie häufig testen. Wir wollen jedoch noch keine unveröffentlichte Entwicklungsversion in die Produktivumgebung kopieren.

Oder vielleicht haben wir eine neue Version heruntergeladen und möchten sie zunächst testen.

Indem wir unser Arbeitsverzeichnis zur $PATH-Variable hinzufügen, sorgen wir dafür, dass die Shell unsere Version findet. Diese Änderung wirkt sich nur auf unsere Sitzung aus. Andere Benutzer verwenden weiterhin die Version in `/usr/local/bin`.

Ein Verzeichnis zu Ihrem $PATH hinzufügen

Sie können den Befehl `export` verwenden, um ein Verzeichnis zur $PATH-Variable hinzuzufügen. Dieses Verzeichnis wird dann in die Liste der durchsuchten Pfade aufgenommen. Da die Shell die Suche beendet, sobald sie eine passende ausführbare Datei findet, sollte Ihr Verzeichnis vor `/usr/local/bin` durchsucht werden.

In unserem Beispiel fügen wir unser Verzeichnis am Anfang der $PATH-Variablen hinzu:

export PATH=/home/dave/work:$PATH

Dieser Befehl setzt den Wert von `$PATH` auf unser Verzeichnis `/home/dave/work` gefolgt vom bisherigen Pfad.
Das erste `PATH` hat kein Dollarzeichen, da wir hier den Wert setzen. Das zweite `$PATH` hat ein Dollarzeichen, weil wir auf den bestehenden Wert der Variable `$PATH` verweisen. Beachten Sie auch den Doppelpunkt (:) zwischen dem neuen Verzeichnis und dem Variablennamen `$PATH`.

So sieht der Pfad nun aus:

echo $PATH

Unser Verzeichnis `/home/dave/work` wurde am Anfang des Pfads hinzugefügt. Der Doppelpunkt trennt es vom Rest des Pfads.

Wir überprüfen, ob unsere Version von `rf` die erste ist, die gefunden wird:

which rf

Der Test zeigt, dass die Shell jetzt unsere Version ausführt:

rf

Die Shell findet Version 1.1 und führt sie aus `/home/dave/work` aus.

Um unser Verzeichnis am Ende der $PATH-Variablen hinzuzufügen, verschieben wir es ans Ende des Befehls:

export PATH=$PATH:/home/dave/work

Änderungen dauerhaft machen

Wie Beth Brooke-Marciniak sagte: „Erfolg ist gut, aber Erfolg ist flüchtig.“ Sobald Sie das Terminalfenster schließen, gehen alle Änderungen an der $PATH-Variablen verloren. Um sie dauerhaft zu machen, müssen Sie Ihren Exportbefehl in eine Konfigurationsdatei einfügen.

Wenn Sie den Exportbefehl in Ihre Datei `.bashrc` einfügen, wird der Pfad jedes Mal festgelegt, wenn Sie ein interaktives Terminalfenster öffnen (nicht SSH-Sitzungen).

In der Vergangenheit wurde der Exportbefehl in die Datei `.profile` eingefügt, um den Pfad für Anmeldesitzungen festzulegen.

Wir haben festgestellt, dass es ausreichend ist, den Exportbefehl entweder in die `.bashrc` oder die `.profile`-Datei einzufügen. In beiden Fällen wird der Pfad korrekt für interaktive und Anmeldesitzungen festgelegt. Ihre Erfahrungen können jedoch variieren. Wir zeigen Ihnen, wie es in beiden Dateien geht.

Verwenden Sie folgenden Befehl in Ihrem `/home`-Verzeichnis, um die `.bashrc`-Datei zu bearbeiten:

gedit .bashrc

Der Editor `gedit` wird mit der geladenen `.bashrc`-Datei geöffnet.

Scrollen Sie zum Ende der Datei und fügen Sie den folgenden Exportbefehl hinzu:

export PATH=/home/dave/work:$PATH

Speichern Sie die Datei. Schließen Sie das Terminalfenster und öffnen Sie es neu, oder verwenden Sie den Befehl `source`, um die `.bashrc`-Datei neu einzulesen:

`. .bashrc`

Überprüfen Sie den Pfad mit folgendem Befehl:

echo $PATH

Das Verzeichnis `/home/dave/work` wird nun am Anfang des Pfads hinzugefügt.

Der Vorgang für die Datei `.profile` ist identisch. Geben Sie den folgenden Befehl ein:

gedit .profile

Der Editor `gedit` wird mit der geladenen `.profile`-Datei gestartet.

Fügen Sie den Exportbefehl am Ende der Datei hinzu und speichern Sie sie. Das Schließen und Öffnen eines neuen Terminalfensters reicht nicht aus, um das Neuladen der `.profile`-Datei zu erzwingen. Sie müssen sich ab- und wieder anmelden oder den Befehl `source` verwenden:

. .profile

Den Pfad für alle Benutzer festlegen

Um den Pfad für alle Benutzer des Systems festzulegen, können Sie die Datei `/etc/profile` bearbeiten.

Verwenden Sie dazu `sudo`:

sudo gedit /etc/profile

Fügen Sie im Editor den Exportbefehl am Ende der Datei hinzu.

Speichern und schließen Sie die Datei. Die Änderungen werden für alle Benutzer wirksam, sobald sie sich das nächste Mal anmelden.

Ein Sicherheitshinweis

Stellen Sie sicher, dass Sie nicht versehentlich einen führenden Doppelpunkt „:“ zu Ihrer $PATH-Variable hinzufügen, wie hier gezeigt:

Dadurch würde das aktuelle Verzeichnis zuerst durchsucht, was ein Sicherheitsrisiko darstellt. Nehmen wir an, Sie haben eine Archivdatei heruntergeladen und in ein Verzeichnis entpackt. Sie betrachten die Dateien und sehen eine weitere Archivdatei. Sie verwenden `unzip`, um diese zu entpacken.

Wenn das erste Archiv eine ausführbare Datei namens `unzip` enthielt, die eine bösartige Datei ist, würden Sie diese anstelle des echten `unzip`-Befehls versehentlich starten, da die Shell zuerst im aktuellen Verzeichnis sucht.

Seien Sie also vorsichtig beim Eingeben Ihrer Exportbefehle. Verwenden Sie `echo $PATH`, um sie zu überprüfen und sicherzustellen, dass sie wie gewünscht aussehen.