Linux PATH-Umgebungsvariable: Anzeigen, ändern und dauerhaft konfigurieren
Die Linux-Umgebungsvariable PATH enthält eine durch Doppelpunkte getrennte Reihenfolge von Verzeichnissen, die von der Shell durchsucht werden, sobald ein Befehl ausgeführt wird. Wird beispielsweise ein Kommando wie python3, grep oder myapp eingegeben, prüft die Shell die in PATH hinterlegten Verzeichnisse von links nach rechts und startet die erste passende Datei, die über Ausführungsrechte verfügt.
In diesem Tutorial erfahren Sie, wie Sie PATH anzeigen, vorübergehend oder dauerhaft unter bash und zsh verändern, vorgenommene Änderungen überprüfen, Verzeichniseinträge entfernen und typische Probleme beheben.
Die Beispiele wurden unter Ubuntu 22.04, Debian 12 und Rocky Linux 9 überprüft. Wo es sinnvoll ist, werden neben den Befehlen auch die erwarteten Ausgaben gezeigt, sodass Sie Ihre Ergebnisse vergleichen und kontrollieren können, ob die jeweilige Änderung korrekt übernommen wurde.
Wichtigste Erkenntnisse
PATHbesteht aus Verzeichnissen, die durch Doppelpunkte voneinander getrennt sind. Bei der Suche nach einem Befehl arbeitet die Shell diese Verzeichnisse von links nach rechts ab.- Mit
echo $PATHundprintenv PATHlässt sich der aktuelle Wert anzeigen. export PATH=$PATH:/new/dirverändertPATHausschließlich für die momentan aktive Shell-Sitzung.- Dauerhafte Anpassungen können bei interaktiven bash-Shells in
~/.bashrc, bei zsh in~/.zshrcund für systemweite Einstellungen in/etc/environmentvorgenommen werden. - Mit
which,type -aundcommand -vkönnen Sie feststellen, auf welche ausführbare Datei ein Befehl tatsächlich verweist. - Nach einer Änderung an einer Shell-Konfigurationsdatei muss beispielsweise
source ~/.bashrcausgeführt oder eine neue Shell-Sitzung gestartet werden, damit die Anpassung wirksam wird. - Die Reihenfolge ist entscheidend: Verzeichnisse, die weiter vorne in
PATHstehen, besitzen Vorrang gegenüber später aufgeführten Verzeichnissen.
Voraussetzungen
- Ein Linux-System mit bash oder zsh. Die gezeigten Befehle wurden unter Ubuntu 22.04, Debian 12 und Rocky Linux 9 getestet.
- Ein Benutzerkonto ohne Root-Anmeldung, das über sudo-Berechtigungen verfügt.
- Grundkenntnisse zu Linux-Umgebungsvariablen und Shell-Variablen.
So funktioniert die Linux PATH-Variable
Was PATH enthält und wie die Shell die Variable verwendet
PATH enthält absolute Verzeichnispfade, die durch Doppelpunkte getrennt werden. Wenn ein Befehl ohne vollständigen Pfad ausgeführt wird, durchsucht die Shell die aufgeführten Verzeichnisse nacheinander und startet die erste passende ausführbare Datei.
Um die einzelnen Verzeichnisse aus PATH jeweils in einer eigenen Zeile auszugeben, verwenden Sie:
tr ':' '\n' <<< "$PATH"
/usr/local/sbin
/usr/local/bin
/usr/sbin
/usr/bin
/sbin
/bin
/usr/local/games
/usr/games
Existiert eine ausführbare Datei mit demselben Namen in mehreren Verzeichnissen, wird die Variante verwendet, deren Verzeichnis in dieser Liste zuerst erscheint.
Wie PATH an Prozesse und Subshells vererbt wird
Untergeordnete Prozesse übernehmen exportierte Umgebungsvariablen vom übergeordneten Prozess. Eine normale Shell-Variable bleibt dagegen zunächst auf die aktuelle Shell beschränkt, bis sie mit export exportiert wird.
MYVAR="hello"
bash -c 'echo $MYVAR' # gibt nichts aus
export MYVAR="hello"
bash -c 'echo $MYVAR' # Ausgabe: hello
Für die Variable PATH gilt dasselbe Vererbungsverhalten.
Schritt 1 – Aktuelle PATH-Variable anzeigen
PATH mit echo anzeigen
Die schnellste Möglichkeit, die von Ihrer Shell durchsuchten Verzeichnisse zu prüfen, ist echo $PATH:
echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/games:/usr/games
Die Ausgabe besteht aus einer einzelnen Zeichenkette, in der die verschiedenen Verzeichnisse jeweils durch einen Doppelpunkt : voneinander getrennt sind.
PATH mit printenv anzeigen
printenv PATH liest den Wert direkt aus der Prozessumgebung, statt ihn über die Variablenersetzung der Shell abzurufen. Dadurch eignet sich dieser Befehl insbesondere für Skripte und andere nicht interaktive Umgebungen:
printenv PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/games:/usr/games
Da printenv ausschließlich exportierte Variablen ausgibt, können damit Werte aus der vererbten Prozessumgebung klar von lokalen Shell-Variablen unterschieden werden.
PATH im Kontext eines Skripts auslesen
Ein mit bash script.sh gestartetes Skript kann einen anderen PATH-Wert erhalten als Ihre interaktive Shell, weil ein solcher Prozess normalerweise weder ~/.bashrc noch ~/.bash_profile einliest. Das folgende Skript zeigt den PATH, den ein nicht interaktiver bash-Prozess tatsächlich erhält:
#!/usr/bin/env bash
echo "Script PATH: $PATH"
Wenn ein Skript unabhängig von seiner Startumgebung einen verlässlichen PATH verwenden soll, können Sie die Variable am Anfang des Skripts explizit festlegen, bevor Befehle ausgeführt werden, die davon abhängig sind:
#!/usr/bin/env bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
echo "Script PATH: $PATH"
Alternativ können Programme direkt über ihren vollständigen absoluten Pfad aufgerufen werden, beispielsweise /usr/bin/python3 anstelle von python3. Dadurch ist das Skript nicht mehr auf die Auflösung über PATH angewiesen.
Schritt 2 – Ein Verzeichnis für die aktuelle Sitzung zu PATH hinzufügen
Temporäre PATH-Änderung mit export setzen
Der Befehl export aktualisiert eine Variable in der aktiven Shell und sorgt gleichzeitig dafür, dass sie an untergeordnete Prozesse weitergegeben wird. Um für die aktuelle Sitzung ein zusätzliches Verzeichnis in PATH aufzunehmen, können Sie es für eine höhere Priorität an den Anfang oder für eine niedrigere Priorität an das Ende setzen:
# Voranstellen: /opt/myapp/bin wird vor allen vorhandenen Verzeichnissen geprüft
export PATH="/opt/myapp/bin:$PATH"
# Anhängen: /opt/myapp/bin wird nach allen vorhandenen Verzeichnissen geprüft
export PATH="$PATH:/opt/myapp/bin"
Wird das neue Verzeichnis an den Anfang gestellt, hat es Vorrang vor den Systemverzeichnissen. Das kann hilfreich sein, wenn beispielsweise eine neuere Version eines Programms zusätzlich zur systemweit vorhandenen Version installiert wurde. Für die allgemeine Verwendung ist das Anhängen am Ende üblicherweise die sicherere Variante.
Überprüfen, ob die Änderung übernommen wurde
Zwei Befehle helfen bei der Kontrolle. echo $PATH zeigt den vollständigen Variablenwert, während which angibt, welche ausführbare Datei bei einem bestimmten Befehl ausgewählt wird:
echo $PATH
which myapp
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/games:/usr/games:/opt/myapp/bin
/opt/myapp/bin/myapp
Diese Änderung gilt ausschließlich für die aktuelle Shell-Sitzung. Sobald das Terminal geschlossen oder eine neue Sitzung gestartet wird, erhält PATH wieder den Wert, der durch die jeweiligen Start- und Konfigurationsdateien vorgegeben ist.
Schritt 3 – Ein Verzeichnis dauerhaft zu PATH hinzufügen
Die richtige Konfigurationsdatei auswählen
Welche Startdatei angepasst werden sollte, hängt sowohl von der verwendeten Shell als auch davon ab, ob es sich um eine Login-Shell oder um eine interaktive Nicht-Login-Shell handelt. Wählen Sie daher die Datei passend zur Art, wie Ihre Shell gestartet wird.
| Datei | Geltungsbereich | Zeitpunkt des Einlesens | Shells |
|---|---|---|---|
~/.bashrc |
Pro Benutzer | Bei jeder interaktiven bash-Shell, die keine Login-Shell ist | bash |
~/.bash_profile |
Pro Benutzer | Bei bash-Login-Shells, die häufig zusätzlich ~/.bashrc laden |
bash |
~/.profile |
Pro Benutzer | Bei Login-Shells, wenn keine ~/.bash_profile vorhanden ist |
bash, sh, dash |
~/.zshrc |
Pro Benutzer | Bei jeder interaktiven zsh-Shell | zsh |
~/.zprofile |
Pro Benutzer | Bei zsh-Login-Shells und damit vergleichbar mit ~/.bash_profile unter bash |
zsh |
/etc/environment |
Systemweit | Wird bei der Anmeldung durch PAM gelesen und nicht als Shell-Skript ausgeführt | Alle |
/etc/profile |
Systemweit | Bei Login-Shells | bash, sh |
/etc/profile.d/*.sh |
Systemweit | Wird über /etc/profile geladen |
bash, sh |
Für die typische interaktive Nutzung auf einem Desktop oder Server mit einem einzelnen Benutzerkonto ist bei bash meist ~/.bashrc und bei zsh üblicherweise ~/.zshrc die passende Datei.
~/.bashrc für Bash-Benutzer bearbeiten
Wenn Sie eine export-Zeile in ~/.bashrc ergänzen, steht der veränderte PATH bei jeder neu gestarteten interaktiven bash-Sitzung zur Verfügung. Öffnen Sie zunächst die Datei:
nano ~/.bashrc
Gehen Sie an das Ende der Datei und ergänzen Sie:
export PATH="$PATH:/opt/myapp/bin"
Laden Sie die aktualisierte Konfiguration, ohne sich abzumelden:
source ~/.bashrc
Überprüfen Sie anschließend den Wert:
echo $PATH
Wenn /opt/myapp/bin in der Ausgabe enthalten ist, ist die neue Einstellung im aktuellen Terminal für nachfolgende Befehle aktiv.
~/.zshrc für Zsh-Benutzer bearbeiten
Bei zsh wird für diesen Zweck die Datei ~/.zshrc verwendet. Öffnen Sie sie mit:
nano ~/.zshrc
Fügen Sie die Export-Zeile hinzu:
export PATH="$PATH:/opt/myapp/bin"
Laden Sie die Konfiguration erneut:
source ~/.zshrc
Kontrollieren Sie anschließend den aktuellen Wert:
echo $PATH
Wenn das System zsh als Login-Shell startet und nicht als interaktive Nicht-Login-Shell, verwenden Sie stattdessen ~/.zprofile.
/etc/environment für systemweite Änderungen bearbeiten
Die Datei /etc/environment wird während der Anmeldung durch PAM verarbeitet und nicht als Shell-Skript interpretiert. Shell-Ausdrücke wie eine Erweiterung von $PATH funktionieren deshalb in dieser Datei nicht. Lesen Sie vor einer Änderung zunächst den vorhandenen Wert aus:
grep PATH /etc/environment
Öffnen Sie danach die Konfigurationsdatei:
sudo nano /etc/environment
Tragen Sie den gesamten Wert vollständig ein, einschließlich der bereits vorhandenen Verzeichnisse und des neuen Verzeichnisses:
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/myapp/bin"
Verwenden Sie innerhalb von /etc/environment kein $PATH. Da Variablen in dieser Datei nicht expandiert werden, muss die komplette Liste der Verzeichnisse als wörtlicher Wert eingetragen werden.
Änderungen an /etc/environment werden erst nach der nächsten Anmeldung aktiv. Ein einfaches Sourcen innerhalb der aktuellen Shell reicht hierfür nicht aus.
Shell-Konfiguration ohne Abmeldung neu laden
Eine neu in ~/.bashrc eingetragene export-Zeile beeinflusst die momentan aktive Shell erst, nachdem die Datei erneut eingelesen wurde. Die folgenden drei Methoden laden die Konfiguration, ohne dass eine Abmeldung erforderlich ist:
# Datei direkt einlesen
source ~/.bashrc
# Gleichwertige Kurzform
. ~/.bashrc
# Aktuellen Shell-Prozess ersetzen (liest ~/.bashrc, aber nicht ~/.bash_profile)
exec bash
exec bash startet eine neue interaktive bash-Shell, die keine Login-Shell ist. Dadurch wird ~/.bashrc, jedoch nicht ~/.bash_profile eingelesen. Befindet sich Ihre Export-Zeile ausschließlich in ~/.bash_profile, verwenden Sie stattdessen source ~/.bash_profile oder starten Sie eine neue Login-Sitzung.
Schritt 4 – Überprüfen, ob PATH-Änderungen funktionieren
Binärauflösung mit which überprüfen
which durchsucht die in PATH angegebenen Verzeichnisse und gibt die erste ausführbare Datei zurück, die zum angegebenen Befehlsnamen passt. Nach einer Anpassung von PATH können Sie damit kontrollieren, ob die gewünschte Datei ausgewählt wird:
which python3
/usr/bin/python3
Der zurückgegebene Pfad bezeichnet normalerweise die Binärdatei, die beim nächsten Ausführen des Befehls gestartet wird, sofern nicht beispielsweise ein Alias oder ein bereits zwischengespeicherter bash-Befehlspfad Vorrang hat.
type und command -v zur Überprüfung verwenden
type -a liefert mehr Informationen als which. Der Befehl zeigt sämtliche Treffer in PATH und erkennt außerdem Aliase oder Shell-Funktionen mit demselben Namen. Das ist besonders hilfreich, wenn Sie prüfen möchten, welche installierte Version bei der Befehlsauflösung Vorrang besitzt:
type -a python3
python3 is /usr/bin/python3
python3 is /usr/local/bin/python3
Für eine POSIX-kompatible Abfrage mit einem einzelnen Ergebnis können Sie folgenden Befehl verwenden:
command -v python3
/usr/bin/python3
type ist ein eingebauter Shell-Befehl und kann Aliase, Funktionen sowie sämtliche passenden PATH-Einträge anzeigen. which konzentriert sich dagegen auf die Verzeichnisse aus PATH und gibt normalerweise den ersten Treffer zurück. Verwenden Sie type -a, wenn Sie Konflikte zwischen mehreren installierten Versionen untersuchen möchten.
Neue Shell-Sitzung starten, um die Dauerhaftigkeit zu prüfen
Wenn Sie echo $PATH direkt nach einem export-Befehl ausführen, bestätigt dies lediglich den Zustand der aktuellen Shell. Es zeigt nicht, ob die Änderung auch in einer neuen Sitzung bestehen bleibt. Starten Sie daher einen neuen Shell-Prozess und prüfen Sie PATH erneut:
exec bash
echo $PATH
Ist das hinzugefügte Verzeichnis weiterhin vorhanden, funktioniert die Startkonfiguration korrekt. Fehlt es dagegen, befindet sich die Export-Zeile möglicherweise nicht in der richtigen Datei, wurde gar nicht gespeichert oder steht hinter einer Bedingung, die die Verarbeitung der Startdatei vorzeitig beendet.
Schritt 5 – PATH-Einträge entfernen oder Duplikate verhindern
Ein bestimmtes Verzeichnis manuell entfernen
Um /opt/myapp/bin aus der aktuellen Sitzung zu entfernen, führen Sie Folgendes aus:
PATH=$(echo "$PATH" | sed -e 's|/opt/myapp/bin:||g' -e 's|:/opt/myapp/bin||g')
export PATH
Das Muster mit dem nachgestellten Doppelpunkt entfernt das Verzeichnis, wenn direkt danach ein Doppelpunkt folgt, und deckt damit Einträge am Anfang sowie in der Mitte ab. Das Muster mit dem vorangestellten Doppelpunkt entfernt den Eintrag, wenn ihm ein Doppelpunkt vorausgeht, und berücksichtigt damit Positionen in der Mitte oder am Ende. Zusammen erfassen beide Ausdrücke alle möglichen Positionen. Prüfen Sie anschließend mit echo $PATH, ob das Verzeichnis tatsächlich entfernt wurde.
Doppelte Einträge beim erneuten Laden von Konfigurationsdateien verhindern
Wenn ~/.bashrc innerhalb derselben Sitzung mehrfach eingelesen wird, beispielsweise nach mehreren Änderungen, kann eine einfache Anweisung zum Anhängen dasselbe Verzeichnis wiederholt in PATH einfügen. Das folgende Prüfmuster ergänzt den Pfad nur, wenn er noch nicht vorhanden ist:
case ":$PATH:" in
*":/opt/myapp/bin:"*) ;;
*) export PATH="$PATH:/opt/myapp/bin" ;;
esac
Die zusätzlichen Doppelpunkte um $PATH und das zu prüfende Zielverzeichnis sorgen dafür, dass das Muster einen vollständigen Eintrag erkennt und nicht versehentlich nur einen Teil eines längeren Verzeichnispfads abgleicht.
Häufige PATH-Probleme beheben
PATH-Änderung bleibt nach der Abmeldung nicht erhalten
Ein export-Befehl ändert PATH nur innerhalb des Shell-Prozesses, in dem er ausgeführt wurde. Sobald dieser Prozess beendet wird, geht eine rein temporäre Änderung verloren. Öffnen Sie zur Kontrolle ein neues Terminal und führen Sie Folgendes aus:
echo $PATH
Fehlt das zuvor hinzugefügte Verzeichnis, wurde die Änderung nicht in einer Startdatei gespeichert. Um zu prüfen, welche Dateien bash bei einer Anmeldung einliest und in welcher Reihenfolge dies erfolgt, verwenden Sie:
bash -lxv 2>&1 | head -50
Die Option -l erzwingt eine Login-Shell, -x aktiviert die Ausführungsverfolgung und -v gibt jede gelesene Zeile aus. Suchen Sie in der Ausgabe nach Einträgen zu ~/.profile, ~/.bash_profile oder /etc/profile, um zu erkennen, welche Datei den Login-PATH beeinflusst. Ergänzen Sie die Export-Zeile anschließend in der passenden Datei und laden Sie die Konfiguration:
echo 'export PATH="$PATH:/opt/myapp/bin"' >> ~/.bashrc
source ~/.bashrc
„Command not found“ nach dem Hinzufügen zu PATH
Ursache: Die PATH-Anpassung wurde möglicherweise innerhalb eines bereits beendeten Skripts oder einer Subshell durchgeführt, es wurde die falsche Startdatei bearbeitet oder die aktive Sitzung hat die neue Konfiguration noch nicht geladen.
Diagnose:
echo $PATH
grep -n PATH ~/.bashrc ~/.profile ~/.bash_profile 2>/dev/null
Kontrollieren Sie, ob die export-Zeile in der für die jeweilige Sitzung zuständigen Datei vorhanden ist und ob diese Datei bereits eingelesen oder eine neue Sitzung gestartet wurde.
Falsche Version einer Binärdatei wird aufgelöst
Ursache: Ein Verzeichnis mit einer älteren Version der ausführbaren Datei kann in PATH vor dem Verzeichnis mit der gewünschten neueren Version stehen.
Diagnose:
type -a python3
Lösung: Stellen Sie das Verzeichnis mit der gewünschten Version über export PATH="/opt/myapp/bin:$PATH" an den Anfang oder entfernen Sie das Verzeichnis mit der unerwünschten Version mithilfe des in Schritt 5 gezeigten sed-Verfahrens.
PATH-Änderungen werden nicht auf GUI-Anwendungen angewendet
Ursache: Viele Desktop-Umgebungen lesen bei der Anmeldung ~/.profile und /etc/environment ein, jedoch nicht ~/.bashrc. Eine Änderung ausschließlich in ~/.bashrc wirkt sich deshalb in der Regel nur auf Terminalanwendungen aus, die eine interaktive bash-Shell ohne Login starten.
Lösung: Verschieben Sie die Export-Zeile nach ~/.profile oder tragen Sie das Verzeichnis in /etc/environment ein. Melden Sie sich danach ab und wieder an.
PATH in speziellen Umgebungen verwalten
PATH in Shell-Skripten und Cronjobs
Cron verwendet normalerweise einen eingeschränkten Standard-PATH, häufig /usr/bin:/bin. Programme, die in Ihrer interaktiven Shell problemlos gefunden werden, können deshalb in Cronjobs fehlen. Definieren Sie PATH am Anfang der Crontab, noch vor den eigentlichen Aufträgen. Öffnen Sie die Crontab mit crontab -e und tragen Sie die Variable vor den geplanten Befehlen ein:
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
# myapp jede Stunde ausführen
0 * * * * /opt/myapp/bin/myapp >> /var/log/myapp.log 2>&1
Die PATH-Zuweisung gilt für alle Cronjobs, die in derselben Crontab darunter definiert sind. Wenn ein von Cron gestartetes Skript ebenfalls Befehle verwendet, die über PATH aufgelöst werden müssen, tragen Sie dieselbe PATH-Definition auch am Anfang dieses Skripts ein.
PATH in Docker-Containern und Dockerfiles
In einem Dockerfile kann die Anweisung ENV verwendet werden, um PATH für das Image zu erweitern:
ENV PATH="/opt/myapp/bin:${PATH}"
Eine mit ENV gesetzte Variable bleibt für alle nachfolgenden Image-Layer erhalten und steht auch in daraus gestarteten Containern zur Verfügung. Dadurch verwenden spätere RUN-, CMD– und ENTRYPOINT-Anweisungen den aktualisierten Wert.
direnv für eine projektbezogene PATH-Verwaltung verwenden
direnv kann Umgebungsvariablen automatisch aktivieren oder wieder entfernen, sobald ein bestimmtes Verzeichnis betreten oder verlassen wird. Installieren Sie das Programm und fügen Sie den passenden Shell-Hook zu Ihrer Startdatei hinzu:
sudo apt install direnv
echo 'eval "$(direnv hook bash)"' >> ~/.bashrc
source ~/.bashrc
Unter Rocky Linux, Fedora oder RHEL verwenden Sie anstelle des gezeigten Installationsbefehls sudo dnf install direnv. Wenn Sie auf einer der genannten Distributionen zsh einsetzen, ersetzen Sie im Hook-Befehl bash durch zsh. Der Hook ist erforderlich, da direnv ohne ihn nicht auf Verzeichniswechsel reagieren kann.
Legen Sie im Stammverzeichnis Ihres Projekts eine Datei namens .envrc an:
PATH_add ./bin
Bestätigen Sie die Datei einmalig:
direnv allow
Sobald Sie das Projektverzeichnis mit cd verlassen, wird PATH automatisch wieder auf den vorherigen Wert zurückgesetzt.
Häufige PATH-Fallstricke in Produktionsumgebungen
Die folgenden Situationen gehören zu den häufigsten Ursachen dafür, dass die Befehlsauflösung trotz eines scheinbar korrekt eingerichteten PATH in produktiven Umgebungen nicht wie erwartet funktioniert.
sudo ignoriert Ihren PATH
Ein Befehl kann ohne Probleme funktionieren und mit sudo dennoch die Meldung „command not found“ erzeugen. Eine häufige Ursache dafür ist die Einstellung secure_path in /etc/sudoers. Sie kann den normalen PATH des Benutzers vollständig ersetzen, sobald ein Befehl über sudo gestartet wird.
Prüfen Sie den aktuell eingerichteten Wert von secure_path:
sudo grep secure_path /etc/sudoers
Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
Ist /opt/myapp/bin dort nicht enthalten, kann sudo myapp fehlschlagen, obwohl das Verzeichnis im normalen Benutzer-PATH vorhanden ist. Statt secure_path zu deaktivieren, können Sie den vollständigen Pfad verwenden:
sudo /opt/myapp/bin/myapp
Alternativ können Sie das gewünschte Verzeichnis zu secure_path hinzufügen, indem Sie /etc/sudoers mit visudo öffnen:
sudo visudo
Passen Sie anschließend die Zeile mit secure_path so an, dass das benötigte Verzeichnis enthalten ist:
Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/myapp/bin"
Bearbeiten Sie /etc/sudoers immer mit visudo. Wird die Datei direkt mit einem gewöhnlichen Texteditor verändert und dabei ein Syntaxfehler eingefügt, kann sudo auf dem betreffenden System anschließend unbrauchbar werden.
Nicht interaktive SSH-Shells lesen ~/.bashrc nicht wie interaktive Shells ein
Wenn ein entfernter Befehl beispielsweise mit ssh user@host 'mycommand' gestartet wird, entsteht eine nicht interaktive Shell, die zugleich keine Login-Shell ist. Das Startverhalten unterscheidet sich damit von einem gewöhnlichen interaktiven Terminal, sodass PATH-Werte aus interaktiven Shell-Konfigurationen dort möglicherweise nicht zur Verfügung stehen.
Um zu prüfen, welchen PATH ein nicht interaktiver SSH-Befehl sieht, verwenden Sie:
ssh user@host 'echo $PATH'
/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin
Die Ausgabe kann einen reduzierten System-PATH zeigen, der von sshd bereitgestellt wird und nicht dem Wert aus Ihrer normalen interaktiven Shell entspricht. Um das benötigte Verzeichnis in diesem Kontext verfügbar zu machen, muss PATH an einer Stelle definiert werden, die von der betreffenden nicht interaktiven Shell verarbeitet wird:
export PATH="$PATH:/opt/myapp/bin"
Prüfen Sie, ob sich am Anfang Ihrer ~/.bashrc eine Bedingung wie [ -z "$PS1" ] && return befindet. Diese Anweisung beendet die weitere Verarbeitung, wenn bash nicht interaktiv läuft, sodass alle darunter stehenden Zeilen übersprungen werden. Ist eine solche Abfrage vorhanden, verschieben Sie die export PATH-Zeile darüber. Fehlt diese Bedingung, kann die Export-Zeile am Ende der Datei verbleiben. Alternativ können Sie PATH in ~/.profile definieren und sicherstellen, dass die benötigte Startkonfiguration diese Datei einliest.
Bash speichert Binärpfade im Cache
Nach einer Änderung an PATH kann bash weiterhin eine ältere Binärdatei ausführen, weil zuvor gefundene Befehle in einer internen Hash-Tabelle zwischengespeichert werden. Ein solcher gespeicherter Pfad kann die erneute Suche über PATH beeinflussen.
Leeren Sie nach einer PATH-Änderung den Cache für Befehlspositionen:
hash -r
Um zu kontrollieren, ob ein bestimmter Befehl zwischengespeichert wurde und auf welchen Pfad er verweist, führen Sie aus:
hash python3
hits command
3 /usr/bin/python3
Ist der gespeicherte Pfad nicht mehr korrekt, entfernt hash -r sämtliche Cache-Einträge. Beim nächsten Aufruf wird dadurch eine neue Suche anhand von PATH durchgeführt.
Reihenfolge der Befehlsauflösung
PATH ist nicht immer die erste Stelle, die bash beim Ausführen eines Befehls überprüft. Die Auflösung erfolgt in folgender Reihenfolge:
- Mit
aliasdefinierte Aliase - Shell-Funktionen
- In die Shell integrierte Befehle wie
cd,echoundtype - Zwischengespeicherte Positionen ausführbarer Dateien aus dem Befehls-Cache
- Die in
PATHangegebenen Verzeichnisse
Diese Reihenfolge erklärt, weshalb type -a bei unerwartetem Verhalten oft aussagekräftiger ist als which. Meldet beispielsweise type python3, dass python3 ein Alias für python ist, hat dieser Alias Vorrang vor jeder über PATH erreichbaren Binärdatei. Entfernen Sie den Alias oder ändern Sie seinen Namen, wenn stattdessen die eigentliche ausführbare Datei verwendet werden soll.
Die PATH-Zusammenstellung unter macOS unterscheidet sich von Linux
Unter macOS wird beim Anmelden /usr/libexec/path_helper verwendet, um PATH aus zwei Quellen zusammenzustellen: /etc/paths, das jeweils ein Verzeichnis pro Zeile enthält, sowie den Dateien innerhalb von /etc/paths.d/. Dieser Vorgang findet statt, bevor die normalen Shell-Startdateien verarbeitet werden. Dadurch können dort eingetragene Verzeichnisse bereits vor Einträgen erscheinen, die später über ~/.zshrc oder ~/.bash_profile ergänzt werden.
Um unter macOS systemweit ein weiteres Verzeichnis hinzuzufügen, erstellen Sie eine Datei in /etc/paths.d/:
sudo sh -c 'echo /opt/myapp/bin > /etc/paths.d/myapp'
Der neue Eintrag wird bei der nächsten Anmeldung wirksam. Überprüfen Sie die Konfiguration mit:
cat /etc/paths
ls /etc/paths.d/
Dieser Abschnitt gilt ausschließlich für macOS. Auf den in diesem Tutorial behandelten Linux-Systemen sind /etc/paths und path_helper nicht vorhanden.
PATH in systemd-Service-Units
Anwendungen, die als systemd-Dienste gestartet werden, übernehmen den PATH Ihrer interaktiven Benutzerumgebung nicht automatisch. systemd startet Dienste mit einer eingeschränkten Umgebung. Befehle in Verzeichnissen wie /opt/myapp/bin werden deshalb möglicherweise nicht gefunden, wenn PATH nicht ausdrücklich in der Unit-Datei definiert wird.
Definieren Sie PATH innerhalb des Abschnitts [Service] der Unit-Datei:
[Service]
Environment="PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/myapp/bin"
ExecStart=/opt/myapp/bin/myapp
Werden mehrere Umgebungsvariablen benötigt, kann stattdessen eine EnvironmentFile verwendet werden:
[Service]
EnvironmentFile=/etc/myapp/environment
ExecStart=/opt/myapp/bin/myapp
Die zugehörige Datei /etc/myapp/environment kann beispielsweise Folgendes enthalten:
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/myapp/bin
MYAPP_ENV=production
Laden Sie nach einer Änderung an der Unit-Konfiguration systemd neu und starten Sie den betreffenden Dienst anschließend neu:
sudo systemctl daemon-reload
sudo systemctl restart myapp
Häufig gestellte Fragen
Was ist die Linux PATH-Umgebungsvariable?
PATH ist eine durch Doppelpunkte getrennte Liste von Verzeichnissen, die von der Shell beim Eingeben eines Befehls von links nach rechts durchsucht wird. Wenn Sie beispielsweise python3 ausführen, prüft die Shell jedes Verzeichnis innerhalb von PATH, bis sie eine ausführbare Datei namens python3 findet, und startet anschließend diese Datei. Ohne PATH müsste für viele Befehle jeweils der vollständige absolute Pfad angegeben werden.
Wie zeige ich meinen aktuellen PATH unter Linux an?
Führen Sie in einem Terminal echo $PATH oder printenv PATH aus, um den aktuellen Wert anzuzeigen. Beide Befehle geben eine durch Doppelpunkte getrennte Verzeichnisliste zurück. Wenn jedes Verzeichnis in einer eigenen Zeile erscheinen soll, verwenden Sie tr ':' '\n' <<< "$PATH".
Was ist der Unterschied zwischen einer temporären und einer dauerhaften PATH-Änderung unter Linux?
Wenn Sie export PATH="$PATH:/new/dir" direkt im Terminal ausführen, gilt die Änderung lediglich für die aktuelle Shell-Sitzung. Nach dem Ende dieser Sitzung wird PATH anhand der normalen Startkonfiguration erneut aufgebaut. Soll die Änderung dauerhaft bestehen bleiben, tragen Sie die Export-Zeile bei bash in ~/.bashrc oder bei zsh in ~/.zshrc ein und laden Sie die jeweilige Datei.
Welche Datei sollte ich bearbeiten, um unter Linux dauerhaft ein Verzeichnis zu PATH hinzuzufügen?
Für interaktive bash-Sitzungen auf einem Desktop oder Server, bei denen die Einstellung nur für einen Benutzer gelten soll, verwenden Sie ~/.bashrc. Für Login-Sitzungen kommen ~/.profile oder ~/.bash_profile infrage. Wenn die Änderung für alle Benutzer des Systems gelten soll, kann /etc/environment verwendet werden. Die Tabelle in Schritt 3 zeigt den jeweiligen Geltungsbereich und das Ladeverhalten der unterschiedlichen Dateien.
Warum wird mein PATH nach einem export-Befehl nicht aktualisiert?
Ein export-Befehl innerhalb eines gewöhnlich gestarteten Skripts kann die aufrufende Shell nicht verändern, da das Skript in einem eigenen Prozess ausgeführt wird. Soll die aktuelle Shell angepasst werden, muss das Skript mit . script.sh oder source script.sh eingelesen werden. Alternativ kann die Änderung in einer Startdatei gespeichert und anschließend eine neue Sitzung begonnen werden. Mit echo $PATH können Sie direkt nach einem interaktiven export prüfen, ob die Änderung in der aktuellen Shell sichtbar ist.
Wie füge ich unter zsh ein Verzeichnis zu PATH hinzu?
Öffnen Sie ~/.zshrc in einem Texteditor, tragen Sie am Ende export PATH="$PATH:/opt/myapp/bin" ein, speichern Sie die Datei und führen Sie anschließend source ~/.zshrc aus. Für zsh-Login-Shells verwenden Sie anstelle von ~/.zshrc die Datei ~/.zprofile.
Wie prüfe ich nach einer PATH-Änderung, welche Binärdatei für einen Befehl verwendet wird?
Mit which python3 sehen Sie den ersten Treffer innerhalb von PATH. Mit type -a python3 können Sie sämtliche Treffer in allen PATH-Verzeichnissen anzeigen lassen, was besonders bei mehreren installierten Versionen hilfreich ist. Als POSIX-kompatible Alternative zu which können Sie command -v python3 verwenden.
Wie entferne ich unter Linux ein Verzeichnis aus PATH?
Um /opt/myapp/bin aus der aktuellen Shell-Sitzung zu entfernen, verwenden Sie:
PATH=$(echo "$PATH" | sed -e 's|/opt/myapp/bin:||g' -e 's|:/opt/myapp/bin||g')
export PATH
Soll das Verzeichnis dauerhaft entfernt werden, löschen Sie die export-Zeile, mit der es ursprünglich hinzugefügt wurde, oder kommentieren Sie diese aus. Die betreffende Zeile kann sich beispielsweise in ~/.bashrc, ~/.zshrc oder einer anderen verwendeten Startdatei befinden. Laden Sie die Datei danach erneut.
Fazit
Dieses Tutorial hat den vollständigen Umgang mit PATH unter Linux behandelt: vom Anzeigen des aktuellen Werts über temporäre und dauerhafte Änderungen unter bash und zsh bis hin zur Auswahl der passenden Startdatei für unterschiedliche Sitzungstypen. Darüber hinaus wurde gezeigt, wie Sie kontrollieren, welche ausführbare Datei tatsächlich verwendet wird, wie sich Verzeichnisse entfernen oder doppelte Einträge verhindern lassen und wie typische Probleme in produktiven Umgebungen untersucht werden können. Dazu gehören unter anderem ein eigener PATH bei sudo, das Verhalten nicht interaktiver SSH-Shells, veraltete Einträge im Befehls-Cache und die isolierte Umgebung von systemd-Diensten.
Damit können Sie PATH für selbst installierte Anwendungen konfigurieren, die passende Startdatei für Ihre Shell und Ihren Anmeldemodus auswählen und nachvollziehen, weshalb ein Befehl nicht gefunden wird oder auf eine unerwartete Binärdatei verweist.


