Die PATH Variable in Linux ist eine Umgebungsvariable, die dem Betriebssystem mitteilt, in welchen Verzeichnissen nach ausführbaren Dateien (also Programmen und Skripten) gesucht werden soll, wenn ein Befehl ohne Angabe eines vollständigen Pfads eingegeben wird. Diese Variable ist von entscheidender Bedeutung für die Funktionalität der Shell und die Ausführung von Programmen im System.

Grundlagen

Die Umgebungsvariable PATH enthält eine Liste von Verzeichnissen, die durch Doppelpunkte (:) getrennt sind. Wenn ein Benutzer einen Befehl in der Shell eingibt, durchsucht das System diese Verzeichnisse in der Reihenfolge, in der sie in der PATH-Variable aufgeführt sind, nach einem Programm, das diesen Befehl ausführen kann.

Beispiel

Angenommen, man gibt den Befehl ls in der Shell ein. Folgendes passiert dabei.

  • Das System sucht zuerst im ersten Verzeichnis der PATH Variable nach einem Programm namens ls.
  • Wenn es dort nicht gefunden wird, durchsucht es das nächste Verzeichnis, und so weiter.
  • Wenn das Programm in keinem der Verzeichnisse gefunden wird, gibt die Shell eine Fehlermeldung aus: command not found.

Typische Eintrage in der PATH-Variable könnten wie folgt aussehen:

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

Verwendung von PATH Variable

Anzeigen der PATH-Variable

Um die aktuelle PATH-Variable anzuzeigen (den Inhalt der Variable), verwendet man folgenden Befehl.

Bash
echo $PATH

Hinzufügen zur PATH-Variable

Um ein neues Verzeichnis zur PATH Variable hinzuzufügen, kann man folgende Anweisung verwenden.

Bash
export PATH=$PATH:/home/benutzername/bin

Alternativ kann man diese Zeile in der .profile, .bashrc oder .bash_profile Dateien eintragen, um dauerhaft diesen Pfad in der PATH Variable zu haben.

Wenn man ein Skript mein-skript.sh in /home/benutzername/bin hat, kann man es ausführen, indem man einfach mein-skript.sh in der Shell eingibt, anstatt den gesamten Pfad anzugeben.

$PATH/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/binPATHPATH$PATH:/home/user/bin=+:/home/user/bin=+

Das „:“ Doppelpunkt, das man zwischen den einzelnen Verzeichnissen sieht, ist lediglich ein Verbinder der einzelnen Abschnitte des Variableninhaltes. Wie man am Hinzufügen sieht, wird der aktuellen Wert der PATH Variable genommen und zu diesem wird (im Beispiel-Schema) „:/home/usr/bin“ hinzugefügt.

Persistente Änderungen an PATH

Wie oben schon angedeutet, sind die, direkt in der Shell hinzugefügten, Ergänzungen von PATH nur temporär. Beim nächsten Laden der Shell sind diese Änderungen weg. Um eine Änderung dauerhaft zu machen, muss man die PATH Variable in einer der Startdateien der Shell setzen, wie z.B. .bashrc oder .bash_profile.

Bash
export PATH=$PATH:/home/benutzername/bin

Danach muss man entweder die .bashrc neu laden oder eine neue Shell-Sitzung starten, damit die Änderung wirksam wird.

Bash Konfiguration neu laden
source ~/.bashrc

Sicherheit und Reihenfolge

Reihenfolge

Die Reihenfolge der Verzeichnisse in der PATH Variable ist wichtig. Das System durchsucht die Verzeichnisse in der Reihenfolge, in der sie aufgelistet sind. Wenn sich zwei Programme mit demselben Namen in unterschiedlichen Verzeichnissen befinden, wird das Programm verwendet, das zuerst gefunden wird.

Beispiel
Angenommen, man hat zwei Versionen eines Programms myprog, eine in /usr/bin und eine in /usr/local/bin. Wenn /usr/local/bin vor /usr/bin in PATH steht, wird die Version von myprog in /usr/local/bin ausgeführt.

Sicherheitsaspekt

Ein Sicherheitsrisiko besteht, wenn das aktuelle Verzeichnis (.) in PATH enthalten ist, insbesondere am Anfang. Dies könnte dazu führen, dass ein bösartiges Skript oder Programm das zufällig denselben Namen wie ein häufiger Befehl hat, ausgeführt wird, wenn man sich in einem Verzeichnis befindet, das dieses Skript enthält. Es ist daher ratsam, . entweder gar nicht oder nur am Ende der PATH Variable zu platzieren.

Fehlerbehebung

Wenn Programme nicht gefunden werden, obwohl sie installiert sind, kann dies oft auf Probleme mit der PATH Variable zurückzuführen sein. Ein häufiger Fehler ist, dass das Verzeichnis, in dem das Programm liegt, nicht in der PATH Variable enthalten ist oder dass eine falsche Version des Programms aufgerufen wird, weil ein anderes Verzeichnis in der PATH weiter oben steht.

Bash Diagnosebeispiel
which myprog

Der which Befehl zeigt an, welches Programm ausgeführt wird, wenn man einen bestimmten Befehl eingibt. Wenn ein anderes als erwartetes Programm ausgeführt wird, sollte man die Reihenfolge der Verzeichnisse in der PATH Variable überprüfen.

Häufige Stolperfallen

`PATH` ohne `$PATH` auf der rechten Seite überschreibt alles

Die Zuweisung export PATH=/home/me/bin ersetzt den kompletten Suchpfad. Danach findet die Shell weder ls noch cat — alles, was nicht in /home/me/bin liegt, ist verloren. Nur in der laufenden Sitzung lässt sich das mit dem absoluten Pfad /usr/bin/echo $PATH und manueller Korrektur retten. Korrekt ist immer export PATH="$PATH:/home/me/bin" (anhängen) oder export PATH="/home/me/bin:$PATH" (voranstellen).

Reihenfolge entscheidet, welches Binary läuft

Die Shell stoppt beim ersten Treffer. Wenn /usr/local/bin vor /usr/bin steht und beide Verzeichnisse python enthalten, wird /usr/local/bin/python ausgeführt — auch wenn die System-Version aktueller ist. Mit type -a python oder which -a python siehst du alle Treffer und ihre Reihenfolge. Beim Debuggen unbekannter Versionen ist das der erste Schritt.

`.` (current directory) im PATH ist ein Sicherheitsrisiko

Liegt . am Anfang von PATH, führt ein cd /tmp && ls ein eventuell dort untergeschobenes Skript namens ls aus, statt das echte /usr/bin/ls. Auf Mehrnutzer-Systemen oder bei verdächtigen Downloads ist das ein realer Angriffsvektor. Wenn überhaupt, gehört . ans Ende — oder besser ganz raus. Eigene Skripte im aktuellen Verzeichnis startet man mit ./skript.sh.

Unterschiedlicher PATH in interaktiver Shell vs. Skript / cron

~/.bashrc wird bei interaktiven Logins ausgeführt, ~/.profile (oder ~/.bash_profile) bei Login-Shells. Cron-Jobs erben in der Regel nur einen minimalen PATH (/usr/bin:/bin). Skripte, die in der Shell laufen, scheitern dann unter cron mit command not found. Lösung: im Skript absolute Pfade verwenden oder PATH explizit am Skriptanfang setzen.

`which` kennt keine Shell-Built-ins und Aliase

which cd liefert auf vielen Systemen /usr/bin/cd — aber cd ist eigentlich ein Shell-Built-in, das gar nicht aus PATH kommt. Auch Aliase und Funktionen sieht which nicht. Genauer ist type cd: Es zeigt, ob ein Befehl als Built-in, Alias, Funktion oder externes Programm verarbeitet wird. In Bash-Skripten ist command -v die portable Variante.

Doppelpunkt am Anfang oder Ende fügt das aktuelle Verzeichnis hinzu

Ein leeres Element in PATH — also :/usr/bin oder /usr/bin: oder :: mittendrin — wird historisch als „aktuelles Verzeichnis“ interpretiert, genau wie ein expliziter .. Solche unsichtbaren Lücken entstehen leicht beim verketteten export PATH="$PATH:$NEW", wenn $NEW leer ist. Vorher prüfen oder mit [ -n "$NEW" ] absichern.

Weiterführende Ressourcen

Externe Quellen

  • Linux Shell — wie die Shell Befehle interpretiert und ausführt
  • Variablen — lokale vs. exportierte Variablen
  • Quoting — Sonderzeichen und Variablen sicher zitieren
  • Berechtigungen — wann ein Programm ausführbar ist
  • Manpagesman bash für die formale Spezifikation
/ Weiter

Zurück zu Grundlagen

Zur Übersicht