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:
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/binVerwendung von PATH Variable
Anzeigen der PATH-Variable
Um die aktuelle PATH-Variable anzuzeigen (den Inhalt der Variable), verwendet man folgenden Befehl.
echo $PATHHinzufügen zur PATH-Variable
Um ein neues Verzeichnis zur PATH Variable hinzuzufügen, kann man folgende Anweisung verwenden.
export PATH=$PATH:/home/benutzername/binAlternativ 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.
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.
export PATH=$PATH:/home/benutzername/binDanach muss man entweder die .bashrc neu laden oder eine neue Shell-Sitzung starten, damit die Änderung wirksam wird.
source ~/.bashrcSicherheit 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.
which myprogDer 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
- Bash Reference Manual: Environment — wie Bash Umgebungsvariablen verarbeitet
- Arch Wiki: Environment variables — PATH und weitere Variablen, distroübergreifend nützlich
- bash(1) – Linux manual page — komplette Referenz inkl. Suchreihenfolge und
hash
Verwandte Artikel
- 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
- Manpages —
man bashfür die formale Spezifikation