VMware ESXi and vSphere Cluster Management

Die PATH-Umgebungsvariable unter Linux verstehen und anzeigen

Lerne, wie PATH unter Linux Befehle findet, wie du die Variable anzeigst und Skripte mit Namen, relativem oder absolutem Pfad startest.

Was ist PATH?

PATH ist eine besonders wichtige Umgebungsvariable unter Linux. Eine Umgebungsvariable ist ein Wert, den eine Shell und die von ihr gestarteten Prozesse für ihre Arbeitsumgebung verwenden können.

Die Shell ist die Kommandozeilenumgebung, die deine Eingaben interpretiert und Programme startet. Wenn du beispielsweise echo oder ein eigenes Skript eingibst, muss die Shell feststellen, was dieser Name bedeutet und wo die passende ausführbare Datei liegt.

PATH enthält dafür eine geordnete Liste von Verzeichnissen. Die Variable enthält nicht einzelne Befehle, sondern Suchorte, in denen die Shell nach ausführbaren Programmen und Skripten suchen kann.

Aufbau und Inhalt der PATH-Variable

Die Einträge in PATH sind durch einen Doppelpunkt (:) getrennt. Ein vereinfachtes Beispiel sieht so aus:

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

Die Shell interpretiert diesen Wert als folgende Reihenfolge:

  1. /usr/local/bin
  2. /usr/bin
  3. /bin
  4. /usr/sbin

Die Reihenfolge ist wichtig. Befinden sich gleichnamige ausführbare Dateien in mehreren PATH-Verzeichnissen, verwendet die Shell normalerweise die erste passende Datei, die sie bei der Suche findet.

Beispiel für gleichnamige Programme

Angenommen, es gibt eine Datei namens tool sowohl in /usr/local/bin als auch in /usr/bin. Steht /usr/local/bin weiter vorne in PATH, wird diese Datei verwendet. Die gleichnamige Datei in /usr/bin wird bei dieser Suche nicht mehr ausgewählt.

Beispiel einer PATH-Suche

Reihenfolge | Verzeichnis | Datei vorhanden? | Ergebnis

1 | /usr/local/bin | Nein | Suche geht weiter

2 | /usr/bin | Ja | Diese Datei wird verwendet

3 | /bin | Ja | Wird nicht mehr geprüft

PATH anzeigen

Mit echo $PATH gibst du den Inhalt von PATH in der aktuellen Shell aus:

echo $PATH

Eine mögliche Ausgabe ist:

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

Das Dollarzeichen vor PATH bedeutet, dass die Shell den Wert der Variable einsetzen soll. Ohne Dollarzeichen würdest du nur den Text PATH ausgeben.

Jeden PATH-Eintrag in einer eigenen Zeile anzeigen

Viele Einträge sind in einer Zeile schwer zu lesen. In einer Bash-Shell kannst du die Doppelpunkte durch Zeilenumbrüche ersetzen:

printf '%s\n' "${PATH//:/\n}"

Die Ausgabe wird dann beispielsweise so dargestellt:

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

Wie die Shell einen Befehl auflöst

Gibst du einen Befehlsnamen ohne Pfadangabe ein, führt die Shell eine Befehlsauflösung durch. Dabei stellt sie fest, ob der Name ein Shell-Befehl ist oder ob sie eine passende ausführbare Datei in den PATH-Verzeichnissen suchen muss.

Beispiel mit echo

Bei der Eingabe von echo Hallo prüft die Shell zunächst, ob echo direkt von ihr bereitgestellt wird. Viele Shells besitzen bestimmte Befehle als Shell-Built-ins. Ein Built-in ist in die Shell eingebaut und benötigt für die Ausführung keine Suche nach einer externen Datei.

Falls der Befehl kein Built-in ist, durchsucht die Shell die Verzeichnisse aus PATH von links nach rechts. Für den Namen programm kann der Ablauf vereinfacht so aussehen:

  1. Prüfe, ob /usr/local/bin/programm vorhanden und ausführbar ist.
  2. Falls nicht, prüfe /usr/bin/programm.
  3. Falls nicht, prüfe /bin/programm.
  4. Wenn keine passende Datei gefunden wird, meldet die Shell, dass der Befehl nicht gefunden wurde.

Mit command -v kannst du prüfen, wie die Shell einen Namen auflöst:

command -v echo
command -v script.sh

Bei einem externen Programm zeigt die Ausgabe normalerweise den gefundenen Pfad. Bei einem Built-in kann die Shell stattdessen den Namen oder einen entsprechenden Hinweis ausgeben.

Warum eine vorhandene Datei trotzdem nicht gefunden wird

Eine Datei kann vorhanden sein, ohne dass die Shell sie über ihren bloßen Namen findet. Das passiert beispielsweise, wenn ihr Verzeichnis nicht in PATH enthalten ist. Zusätzlich muss die Datei als Programm ausführbar sein. Der Dateiname allein ist daher keine Garantie dafür, dass die Shell die Datei starten kann.

Ein Skript aus einem PATH-Verzeichnis starten

Liegt ein ausführbares Skript in einem Verzeichnis, das in PATH enthalten ist, kannst du es über seinen Namen starten. Angenommen, /bin ist in PATH enthalten und dort liegt ein ausführbares Skript namens script.sh:

cd /home/bob
script.sh

Obwohl sich die Shell im Arbeitsverzeichnis /home/bob befindet, sucht sie auch in den PATH-Verzeichnissen. Findet sie dort /bin/script.sh und besitzt die Datei die nötige Ausführungsberechtigung, wird das Skript gestartet.

Ein Arbeitsverzeichnis ist das Verzeichnis, in dem sich die aktuelle Shell-Sitzung befindet. Es ist nicht automatisch identisch mit den Verzeichnissen aus PATH.

Skripte außerhalb von PATH ausführen

Angenommen, script.sh liegt in /home/bob, und /home/bob ist nicht in PATH enthalten. Dann reicht diese Eingabe nicht aus:

script.sh

Die Shell sucht bei einem bloßen Namen nur in ihren bekannten Suchverzeichnissen. Sie verwendet das aktuelle Arbeitsverzeichnis normalerweise nicht automatisch.

Relativer Pfad mit ./

Mit ./ gibst du ausdrücklich an, dass die Datei im aktuellen Arbeitsverzeichnis liegt:

cd /home/bob
./script.sh

Der Punkt (.) steht für das aktuelle Arbeitsverzeichnis. ./script.sh bedeutet deshalb: „Starte script.sh aus genau dem Verzeichnis, in dem ich mich gerade befinde.“ Diese Schreibweise umgeht die PATH-Suche.

Absoluter Pfad

Ein absoluter Pfad beginnt am Wurzelverzeichnis / und beschreibt den vollständigen Weg zu einer Datei:

/home/bob/script.sh

Auch diese Schreibweise umgeht PATH. Sie funktioniert unabhängig davon, in welchem Arbeitsverzeichnis sich die Shell befindet, sofern die Datei vorhanden und ausführbar ist.

Vergleich: Befehlsname, relativer Pfad und absoluter Pfad

Eingabeform | Beispiel | Verwendet PATH? | Bedeutung

Befehlsname | script.sh | Ja | Shell sucht den Namen in den PATH-Verzeichnissen

Relativer Pfad | ./script.sh | Nein | Datei liegt relativ zum aktuellen Arbeitsverzeichnis

Absoluter Pfad | /home/bob/script.sh | Nein | Vollständiger Pfad ab dem Wurzelverzeichnis

Ausführungsberechtigung prüfen

Damit ein Skript direkt mit ./script.sh oder über seinen Namen gestartet werden kann, benötigt es die passende Ausführungsberechtigung. Eine ausführbare Datei ist ein Programm oder Skript, das mit den erforderlichen Rechten gestartet werden darf.

Fehlt diese Berechtigung, kannst du sie beispielsweise so setzen:

chmod +x script.sh

Danach kannst du das Skript erneut starten:

./script.sh

Die Ausführungsberechtigung allein macht ein Skript jedoch noch nicht über seinen bloßen Namen auffindbar. Dafür muss sein Verzeichnis zusätzlich in PATH enthalten sein.

Sicherheits- und Praxisaspekte

Das aktuelle Verzeichnis ist normalerweise nicht in PATH

Linux nimmt das aktuelle Verzeichnis normalerweise nicht automatisch in PATH auf. Dadurch wird verhindert, dass beim Eingeben eines allgemeinen Befehlsnamens unbemerkt eine gleichnamige Datei aus dem aktuellen Verzeichnis gestartet wird.

Wenn du bewusst eine Datei aus dem aktuellen Verzeichnis ausführen möchtest, verwende deshalb die eindeutige Schreibweise ./dateiname.

Die Reihenfolge kann die Sicherheit beeinflussen

Ein unsicherer PATH kann dazu führen, dass ein unerwartetes Programm gestartet wird. Befindet sich beispielsweise ein Verzeichnis mit einer gleichnamigen Datei vor einem vertrauenswürdigen Systemverzeichnis, wird die Datei aus dem zuerst geprüften Verzeichnis ausgewählt.

Prüfe bei unerwartetem Verhalten den aufgelösten Pfad:

command -v programm

Für eigene Skripte ist ein persönliches Binärverzeichnis wie /home/bob/bin eine übliche Ablageoption. Wichtig ist, die Herkunft ausführbarer Dateien zu kennen und bei gleichnamigen Programmen die PATH-Reihenfolge zu beachten.

Fehlerbehebung

„Befehl nicht gefunden“ beim Aufruf von script.sh

Ursache: Das Verzeichnis mit dem Skript ist nicht in PATH, und es wurde kein Pfad angegeben.

Lösung: Befindet sich das Skript im aktuellen Arbeitsverzeichnis, starte es mit ./script.sh. Alternativ verwendest du den absoluten Pfad:

/home/bob/script.sh

./script.sh funktioniert trotz vorhandener Datei nicht

Ursache: Das Skript besitzt möglicherweise keine Ausführungsberechtigung.

Lösung:

chmod +x script.sh
./script.sh

Ein anderes gleichnamiges Programm wird gestartet

Ursache: Ein anderes PATH-Verzeichnis steht weiter vorne und enthält eine gleichnamige ausführbare Datei.

Lösung: Ermittle den verwendeten Pfad:

command -v programm

Kontrolliere danach die PATH-Reihenfolge oder rufe das gewünschte Programm mit einem eindeutigen absoluten oder relativen Pfad auf.

Der erwartete Pfad fehlt in echo $PATH

Ursache: Die aktuelle Shell-Sitzung hat diesen PATH-Eintrag nicht erhalten.

Lösung: Prüfe den aktuellen Wert mit echo $PATH und verwende für die konkrete Ausführung zunächst den vollständigen Pfad zum Programm. Eine dauerhafte PATH-Konfiguration hängt von der verwendeten Shell und deren Konfigurationsdateien ab.

Das Wichtigste auf einen Blick

  • PATH ist eine Umgebungsvariable mit einer geordneten Liste von Verzeichnissen.
  • Die Verzeichnisse werden durch Doppelpunkte getrennt.
  • Bei einem Befehlsnamen ohne Pfadangabe durchsucht die Shell PATH in der angegebenen Reihenfolge.
  • Das erste passende ausführbare Programm wird verwendet.
  • Shell-Built-ins können direkt von der Shell bereitgestellt werden und benötigen keine externe Datei.
  • Ein Skript außerhalb von PATH startest du mit ./script.sh oder einem absoluten Pfad wie /home/bob/script.sh.
  • Für den direkten Start muss ein Skript die Ausführungsberechtigung besitzen.
  • Das aktuelle Verzeichnis ist normalerweise nicht automatisch in PATH enthalten.

Weitere Zusammenhänge findest du auf der Seite zur PATH-Umgebungsvariable.