which ist der pragmatische Klassiker, um herauszufinden, welche Datei in $PATH zu einem Befehl gehört. Es gibt den ersten Treffer aus — mehr nicht. Genau diese Schlichtheit ist Stärke und Schwäche zugleich: which ignoriert Aliases, Funktionen und Builtins und verhält sich auf verschiedenen Distributionen unterschiedlich.
Was which macht
which durchsucht nacheinander die Verzeichnisse in der Umgebungsvariable $PATH und gibt den vollständigen Pfad der ersten gefundenen ausführbaren Datei aus. Der Exit-Code ist 0 bei Erfolg, andernfalls ungleich null.
which python3
which git/usr/bin/python3
/usr/bin/gitWas which NICHT findet
which hat einen sehr engen Blick — es interessiert sich ausschließlich für reguläre Dateien im PATH. Damit fällt einiges durchs Raster:
- Aliases —
alias ll='ls -la'taucht nicht auf - Funktionen — selbst definierte Shell-Funktionen werden ignoriert
- Builtins —
cd,echo,pwdhaben keinen Pfad - Keywords —
if,while,forsind syntaktische Konstrukte
Wenn du wirklich wissen willst, was die Shell ausführt, sind type oder command -v die ehrlicheren Werkzeuge — sie kennen die volle Auflösungskette.
Optionen und Plattform-Unterschiede
-a Zeigt alle Treffer im PATH, nicht nur den ersten. Praktisch, wenn dasselbe Programm mehrfach installiert ist (z. B. /usr/bin/python3 und /usr/local/bin/python3).
-s Stiller Modus — nur Exit-Code, keine Ausgabe. Auf vielen Systemen verfügbar, aber nicht überall.
which -a python3/usr/local/bin/python3
/usr/bin/python3which ist nicht überall dasselbe Programm. Auf älterem Debian/Ubuntu war es ein csh-Skript, das ~/.cshrc einliest — in einer Bash-Sitzung wenig hilfreich. Neuere Debian-Versionen liefern einen Bash-Wrapper, Arch und Alpine ein eigenständiges C-Binary mit eigenem Optionen-Set. Diese Inkonsistenz ist der Hauptgrund, warum which heute als veraltet gilt.
Vergleich zu type und command -v
Drei Werkzeuge, drei Sichtweisen auf denselben Befehl:
| Werkzeug | Findet Aliases | Findet Builtins | Standardisiert |
|---|---|---|---|
which | nein | nein | nein |
type | ja | ja | Bash-Builtin |
command -v | ja | ja | POSIX |
Für die tägliche Bash-Arbeit ist type die ehrlichere Wahl, in Skripten ist command -v der Standard.
Stolperfallen
which kann ein csh-Skript sein
Auf älteren Debian- und Ubuntu-Systemen war which ein csh-Skript, das ~/.cshrc einliest — in einer Bash-Sitzung also nutzlos für Aliases. Auf Arch, Alpine und vielen anderen ist es ein eigenständiges C-Programm mit eigenem Optionen-Set. Diese Inkonsistenz ist genau der Grund, warum POSIX command -v empfiehlt.
Aliases und Builtins sind unsichtbar
Wenn du which ls aufrufst und /usr/bin/ls zurückbekommst, sagt dir das nichts darüber, was die Shell tatsächlich ausführt. Ein alias ls='ls --color=auto' ändert den effektiven Aufruf — which zeigt das nicht. Dasselbe gilt für Builtins wie cd oder echo, die which schlicht nicht findet.
Standardmäßig nur der erste Treffer
which programm gibt nur den ersten gefundenen Pfad aus. Wenn dasselbe Tool mehrfach installiert ist (typisch: /usr/bin/python3 UND /usr/local/bin/python3), bekommst du ohne -a keinen Hinweis darauf, welche Version Vorrang hat.
Empfehlung: command -v statt which
Für Skripte ist command -v die richtige Wahl: standardisiert, in jeder POSIX-Shell verfügbar und mit deterministischem Verhalten. which ist allenfalls noch interaktiv praktisch — und auch dort schlägt type es in den meisten Fällen.
Weiterführende Ressourcen
Externe Quellen
- which(1) — Linux Manpage — Manpage des klassischen
which - Why not use which? — Detaillierte Diskussion auf Unix Stack Exchange
- POSIX command(1p) — Die portable Alternative
Verwandte Artikel
- Linux type — Volle Auflösung inklusive Aliases und Builtins
- Linux command — Der POSIX-Standard für Skripte
- Linux whereis — Binary, Source und Manpage finden
- Linux hash — Bash-Cache für Pfad-Lookups
- Linux PATH — Wie
$PATHaufgebaut ist