command ist der POSIX-Standard zur Befehlsauflösung — verfügbar in jeder POSIX-konformen Shell, von Bash und Zsh über Dash bis Ash. Mit command -v prüfst du portabel, ob ein Programm existiert; ohne Optionen umgeht command Aliases und Funktionen und ruft direkt das Builtin oder die Datei. Genau diese zwei Fähigkeiten machen es unverzichtbar für robuste Skripte.
command -v — die portable Verfügbarkeitsprüfung
command -v name gibt aus, was die Shell beim Aufruf von name ausführen würde — bei Aliases den Alias-Text, bei Funktionen den Funktionsnamen, bei Dateien den Pfad. Der Exit-Code ist 0 bei Erfolg und ungleich null, wenn der Befehl unbekannt ist.
command -v jq
command -v ls/usr/bin/jq
alias ls='ls --color=auto'Weil command zu POSIX gehört, funktioniert dasselbe Skript in Bash, Dash, Zsh und Ash gleich — anders als type, das Bash-spezifisch ist, oder which, das je nach Distro variiert.
Best Practice: Existenzprüfung in Skripten
In Skripten ist command -v der idiomatische Weg, um zu prüfen, ob ein Programm verfügbar ist:
if command -v jq >/dev/null 2>&1; then
echo "jq ist installiert"
else
echo "jq fehlt - bitte installieren" >&2
exit 1
fiDas Pattern ist so verbreitet, dass es als Quasi-Standard gilt. Wichtig sind die zwei Umleitungen: >/dev/null unterdrückt die Standardausgabe, 2>&1 zusätzlich Fehlermeldungen — sodass nur der Exit-Code zählt.
command ohne -v — Aliases und Funktionen umgehen
Eine zweite, oft übersehene Rolle: command name ruft den Befehl name auf und überspringt dabei Aliases und Funktionen. Builtins und PATH-Treffer werden weiterhin verwendet.
alias rm='rm -i'
rm datei.txt # fragt nach
command rm datei.txt # löscht ohne RückfragePraktisch in Skripten oder Funktionen, in denen du dich nicht auf die Aliases der interaktiven Shell verlassen willst. Wer den PATH-Lookup wirklich erzwingen muss, kombiniert es mit -p: command -p rm nutzt einen sicheren System-PATH.
command -V — der ausführliche Bruder
Mit großem -V bekommst du eine menschenlesbare Beschreibung, vergleichbar mit type -a:
command -V ls
command -V cdls is aliased to `ls --color=auto'
cd is a shell builtinDas gemischte Quoting im Alias-Output (öffnender Backtick `, schließendes Single-Quote ') ist Absicht und stammt aus dem GNU-Quoting-Stil — kein Tippfehler von Bash, sondern ein Überbleibsel aus Pre-Unicode-Zeiten, als die beiden Zeichen wie typografische Anführungszeichen aussahen.
Für Skripte ist -v (klein) die richtige Wahl, weil die Ausgabe kompakt und maschinell verwertbar ist. -V ist eher zum Nachschauen gedacht.
Besonderheiten
command ist POSIX, type ist Bash
command -v funktioniert in jeder POSIX-konformen Shell — Dash, Ash, Bash, Zsh, Ksh. type ist ein Bash-Builtin und in #!/bin/sh-Skripten (das in vielen Distros auf Dash zeigt) nicht zuverlässig. Wer portable Skripte schreibt, nimmt command -v.
command umgeht Aliases auch in Funktionen
Innerhalb einer Shell-Funktion namens ls willst du oft das echte ls aufrufen, nicht dich selbst rekursiv. command ls macht genau das: überspringt Aliases und Funktionen, ruft aber Builtins und Datei-Befehle weiterhin auf. Das ist die saubere Lösung gegen Endlos-Rekursionen in Wrapper-Funktionen.
command -p nutzt einen sicheren System-PATH
command -p name ignoriert dein $PATH und nutzt eine vom System definierte sichere Liste (typischerweise /usr/bin:/bin). Praktisch in Skripten, die robust gegen manipulierte Umgebungen sein sollen — oder wenn du sicher gehen willst, dass rm auch wirklich /bin/rm ist und nicht ein Trojaner aus ~/bin.
Klein -v für Skripte, groß -V zum Anschauen
command -v liefert kompakte, maschinenlesbare Ausgabe und ist in Prüfungen überall im Einsatz. command -V ist verbose, gibt ganze Sätze aus und ist eher das interaktive Pendant zu type -a. In Skripten nimmt man -v, am Prompt vorzugsweise gleich type.
Weiterführende Ressourcen
Externe Quellen
- POSIX command(1p) — Die offizielle POSIX-Spezifikation
- Bash Reference Manual: Bourne Shell Builtins —
commandals POSIX-Builtin - ShellCheck Wiki: SC2230 — Warum ShellCheck
command -vstattwhichempfiehlt
Verwandte Artikel
- Linux which — Der nicht-portable Klassiker
- Linux type — Der Bash-Builtin mit voller Auflösung
- Linux whereis — Binary, Source und Manpage
- Linux Shell — Bash, Dash, Zsh und ihre Unterschiede
- Linux PATH — Wie
$PATHaufgebaut ist