VMware ESXi and vSphere Cluster Management
Linux: Den vollständigen Pfad eines Befehls mit which finden
Mit which finden Sie ausführbare Linux-Befehle in PATH. Lernen Sie Syntax, -a, PATH-Reihenfolge, Fehlersuche und bessere Shell-Werkzeuge kennen.
Was macht which?
which ist ein Dienstprogramm, das anhand eines Befehlsnamens nach einer passenden ausführbaren Datei sucht. Wird beispielsweise which touch ausgeführt, erscheint typischerweise ein vollständiger Pfad wie /usr/bin/touch.
Eine ausführbare Datei kann aufgrund ihrer Berechtigungen und ihres Inhalts als Programm gestartet werden. which sucht dabei üblicherweise nur in den Verzeichnissen, die über die Umgebungsvariable PATH erreichbar sind. Eine Umgebungsvariable ist ein Wert aus der Prozessumgebung, den Shells und Programme verwenden.
Die Ausgabe hilft unter anderem dabei, herauszufinden, welche Programminstallation beim Aufruf eines Befehls bevorzugt wird. Das ist besonders nützlich, wenn mehrere Versionen von Python, Java, Git oder einem anderen Programm installiert sind.
Grundsyntax von which
Mit einem einzelnen Befehlsnamen lautet die Syntax:
which befehlAls Argument wird normalerweise nur der Name des gesuchten Kommandos angegeben, nicht der vollständige Pfad. Ein praktisches Beispiel ist:
which touchFür mehrere Befehle können mehrere Namen in einem Aufruf folgen:
which ls grep awkFür jeden Namen, der gefunden wird, gibt which einen Pfad aus. Die konkrete Ausgabe hängt von Distribution, Installation und aktueller Shell-Umgebung ab.
PATH und die Suchreihenfolge
PATH ist eine geordnete Liste von Verzeichnissen, in denen die Shell nach ausführbaren Programmen sucht. Die Verzeichnisse sind unter Linux normalerweise durch Doppelpunkte getrennt:
echo "$PATH"Zur besseren Lesbarkeit lässt sich jedes Verzeichnis in einer eigenen Zeile anzeigen:
printf '%s\n' "$PATH" | tr ':' '\n'Die Verzeichnisse werden von links nach rechts geprüft. Stehen beispielsweise /home/alex/.local/bin und danach /usr/bin in PATH, wird eine passende Datei im ersten Verzeichnis bevorzugt.
/home/alex/.local/bin:/usr/local/bin:/usr/bin:/binOhne Optionen gibt which normalerweise nur den ersten passenden ausführbaren Fund aus. Dadurch entspricht die Ausgabe im Regelfall der Programmversion, die bei einem externen Befehlsaufruf bevorzugt wird. Eine Datei außerhalb aller PATH-Verzeichnisse wird von which nicht gefunden, selbst wenn sie existiert.
Wichtige Aufrufe von which
| Aufruf | Zweck | Typische Ausgabe |
|---|---|---|
which befehl | Den ersten passenden PATH-Treffer anzeigen. | Ein vollständiger Pfad, zum Beispiel /usr/bin/touch. |
which -a befehl | Alle passenden ausführbaren Dateien in den PATH-Verzeichnissen auflisten. | Mehrere Pfade in Suchreihenfolge; der erste ist der bevorzugte Treffer. |
which befehl1 befehl2 | Mehrere Befehlsnamen in einem Aufruf prüfen. | Je gefundener Datei eine Pfadausgabe. |
Mit -a mehrere Installationen finden
Die Option -a listet alle passenden ausführbaren Dateien auf, die in den PATH-Verzeichnissen gefunden werden:
which -a python3Eine mögliche Ausgabe könnte mehrere Installationsorte zeigen, etwa eine benutzerspezifische Version und eine Systemversion. Die Reihenfolge ist entscheidend: Der erste Eintrag entspricht weiterhin dem zuerst geprüften passenden Verzeichnis und ist damit normalerweise die bevorzugte Variante.
Dasselbe Verfahren funktioniert zum Beispiel mit:
which -a java
which -a gitDie Ausgabe zeigt nur Dateien, die über PATH gefunden werden. Andere Installationen an nicht eingetragenen Orten erscheinen nicht automatisch.
Wenn which keinen Treffer findet
Gibt es in keinem PATH-Verzeichnis ein passendes ausführbares Programm, erscheint keine Pfadausgabe. Typische Ursachen sind:
- Das Programm ist nicht installiert.
- Der Befehlsname enthält einen Tippfehler oder lautet anders als erwartet.
- Das Installationsverzeichnis fehlt in
PATH. - Die gefundene Datei ist nicht ausführbar.
Für Skripte sollte nicht die menschenlesbare Ausgabe von which ausgewertet werden. Verlässlicher ist der Exit-Status, also der numerische Rückgabewert eines Befehls. Der Status 0 steht üblicherweise für Erfolg; ein anderer Wert signalisiert einen Fehler oder fehlenden Treffer.
which unbekanntes-programm; echo $?Kontrollieren Sie bei einem fehlenden Treffer zunächst Schreibweise, Installation und PATH. Die Variable kann mit den oben gezeigten Befehlen vollständig untersucht werden.
PATH sicher und gezielt anpassen
Ein zusätzliches Benutzerverzeichnis kann für die aktuelle Shell-Sitzung an den Anfang von PATH gesetzt werden:
export PATH="$HOME/.local/bin:$PATH"Das vorhandene $PATH wird dabei bewusst angehängt. So bleiben die bisherigen Systempfade erhalten, während Programme aus $HOME/.local/bin bevorzugt werden. Verzeichnisse am Anfang von PATH sollten nur vertrauenswürdige Inhalte enthalten.
Eine solche Änderung gilt zunächst nur für die aktuelle Sitzung und deren nachfolgende Prozesse. Soll sie dauerhaft gelten, wird der Export-Befehl in eine passende Shell-Initialisierungsdatei eingetragen, beispielsweise in eine Bash- oder Zsh-Konfigurationsdatei. Nach dem erneuten Einlesen der Datei oder dem Start einer neuen Shell steht die Änderung dauerhaft für diese Benutzerumgebung zur Verfügung.
Grenzen von which in Shells
Eine Shell ist ein Kommandointerpreter wie Bash, Zsh oder Fish. Beim Aufruf eines Namens kann sie mehr berücksichtigen als nur eine ausführbare Datei in PATH. Dazu gehören Aliase, Shell-Funktionen, eingebaute Shell-Kommandos und intern gespeicherte Suchergebnisse, sogenanntes Hashing.
Ein Alias ist eine von der Shell definierte Kurzform oder Umleitung für einen Befehl. Eine Shell-Funktion ist ein in der Shell definierter Befehlsblock. Beide können einen gleichnamigen Programmpfad überdecken. Je nach System und Implementierung bildet which solche Konstruktionen nicht vollständig oder nicht zuverlässig ab.
Für die tatsächliche Kommandoauflösung sind in Bash und ähnlichen Shells meist diese Werkzeuge geeigneter:
command -v touch
type -a touchcommand -v prüft shell-nah, wie ein Name aufgelöst wird, und eignet sich besonders für Skripte. type zeigt, ob ein Name beispielsweise ein Alias, eine Funktion, ein Builtin oder ein externes Programm ist. Die Option -a listet dabei mehrere mögliche Auflösungen auf.
| Werkzeug | Findet externe Dateien in PATH | Erkennt Alias und Funktionen | Geeignet für Skripte | Haupteinsatz |
|---|---|---|---|---|
which | Ja, üblicherweise den ersten Treffer; mit -a alle Treffer. | Nicht vollständig oder nicht zuverlässig auf allen Systemen. | Eher für interaktive Anzeige. | Schnell den PATH-Pfad eines externen Programms anzeigen. |
command -v | Ja, shell-nah. | Ja, je nach Shell-Auflösung. | Ja, insbesondere über den Exit-Status. | Robuste Verfügbarkeits- und Auflösungsprüfung. |
type -a | Ja. | Ja, differenziert nach Alias, Funktion, Builtin und Datei. | Vor allem zur Diagnose. | Die tatsächliche Shell-Auflösung untersuchen. |
Ein Shell-Builtin ist ein Befehl, den die Shell selbst bereitstellt und nicht als separate Datei aus PATH startet. Falls ausdrücklich ein solches Builtin geprüft werden soll, kann in Bash beispielsweise builtin verwendet werden.
Skripttaugliche Verfügbarkeitsprüfung
Für Shell-Skripte sollte die menschenlesbare Ausgabe nicht geparst werden. Verwenden Sie stattdessen den Exit-Status von command -v:
if command -v curl >/dev/null 2>&1; then
echo 'curl verfügbar'
else
echo 'curl fehlt'
fiSo funktioniert die Prüfung unabhängig davon, wie die jeweilige which-Implementierung ihre Ausgabe formatiert.
Fehlersuche bei mehreren Versionen
Unerwarteter Programmpfad
Wenn which nicht die erwartete Installation zeigt, verwenden Sie:
which -a programmnameVergleichen Sie anschließend die Reihenfolge der Treffer mit der zeilenweise ausgegebenen PATH-Reihenfolge. Prüfen Sie die Versionen zusätzlich über die vollständigen Pfade, damit nicht versehentlich eine andere Auflösung verwendet wird.
Die Lösung besteht meist darin, das gewünschte Verzeichnis vor andere PATH-Einträge zu setzen, einen absoluten Pfad zu verwenden oder einen versionsspezifischen Befehl einzusetzen. Ändern Sie die Reihenfolge bewusst und lassen Sie vorhandene Systempfade erhalten.
Alias oder Funktion überdeckt das Programm
Wenn sich der ausgeführte Befehl anders verhält als der von which angezeigte Pfad, prüfen Sie die Shell-Auflösung:
type -a lsDie Ausgabe kann einen Alias, eine Funktion, ein Builtin und externe Pfade unterscheiden. Passen Sie den Alias oder die Funktion an beziehungsweise entfernen Sie sie, wenn tatsächlich das externe Programm verwendet werden soll. Nach Änderungen an der Shell-Konfiguration kann eine neue Shell erforderlich sein.
Typische Symptome und Prüfschritte
| Symptom | Wahrscheinliche Ursache | Prüfschritt | Lösung |
|---|---|---|---|
| Keine Ausgabe | Programm fehlt, Name ist falsch, Verzeichnis fehlt in PATH oder Datei ist nicht ausführbar. | command -v, PATH und Installation prüfen. | Programm installieren, korrekten Namen verwenden oder PATH gezielt ergänzen. |
| Unerwarteter Programmpfad | Ein anderes PATH-Verzeichnis steht weiter vorne. | which -a programmname und PATH-Reihenfolge vergleichen. | Gewünschten Pfad voranstellen oder absoluten Pfad verwenden. |
| Mehrere Treffer mit -a | Mehrere Installationen sind über PATH erreichbar. | Treffer und Versionen über vollständige Pfade prüfen. | PATH-Priorität oder versionsspezifischen Aufruf festlegen. |
| Alias statt erwartetem Programm | Alias oder Shell-Funktion überdeckt den externen Befehl. | type -a befehl ausführen. | Alias oder Funktion anpassen beziehungsweise entfernen. |
Sicherheits- und Administrationshinweise
Unerwartete Verzeichnisse am Anfang von PATH können problematisch sein. Befindet sich dort ein benutzerbeschreibbares Verzeichnis, könnte eine gleichnamige Datei einen vertrauenswürdigen Systembefehl überdecken. Ein unbedachter Aufruf würde dann möglicherweise ein anderes Programm starten.
Prüfen Sie deshalb, welche Verzeichnisse in PATH stehen und wem sie gehören. Verwenden Sie nur vertrauenswürdige Verzeichnisse früh in der Suchreihenfolge. which ist jedoch keine Sicherheitsprüfung der Dateiherkunft oder Integrität: Die Ausgabe bestätigt weder, dass eine Datei vertrauenswürdig ist, noch dass sie unverändert oder aus einer bestimmten Quelle stammt.
Kurzüberblick
which befehlzeigt normalerweise den ersten passenden ausführbaren PATH-Treffer.which -a befehlmacht mehrere über PATH erreichbare Installationen sichtbar.PATHwird von links nach rechts durchsucht; die Reihenfolge bestimmt die Priorität.- Eine Datei außerhalb von
PATHwird vonwhichnicht gefunden. - Für Alias-, Funktions-, Builtin- und Shell-Auflösungen sind
type -aundcommand -vgeeigneter. - In Skripten sollte der Exit-Status von
command -vstatt einerwhich-Ausgabe ausgewertet werden. - Ein früher, beschreibbarer PATH-Eintrag kann gleichnamige Programme einschleusen oder Systemprogramme überdecken.
Weitere Informationen zum Thema finden Sie im Which-Befehl unter Linux.