In Bash prüfen, ob ein Programm installiert ist
November 30, 2015
Beim Schreiben von portablen und robusten Shell-Skripten ist es unerlässlich, vor der Verwendung externer Programme zu überprüfen, ob diese überhaupt auf dem System installiert und verfügbar sind. Dies verhindert Laufzeitfehler und ermöglicht es, dem Benutzer aussagekräftige Fehlermeldungen zu geben.
Die POSIX-konforme und zuverlässigste Methode hierfür ist der Befehl command -v.
Warum command -v anstelle von which oder type?
command -v: Dies ist der empfohlene, POSIX-standardisierte Weg. Der Befehl ist ein Shell-Builtin und prüft, wie die Shell einen Befehl interpretieren würde (Alias, Funktion oder ausführbare Datei imPATH). Er gibt bei Erfolg den Pfad zur ausführbaren Datei oder den Alias/die Funktion zurück und hat einen Exit-Code von0. Bei Misserfolg gibt er nichts aus und hat einen Exit-Code ungleich0.which: Ein externes Programm, dessen Verhalten zwischen verschiedenen Systemen variieren kann. Es durchsucht nur denPATHund berücksichtigt keine Aliase oder Shell-Funktionen. Seine Verwendung wird in modernen Skripten nicht mehr empfohlen.type: Ein weiteres Shell-Builtin. Es ist ebenfalls eine gute Option, abercommand -vist speziell für diesen Anwendungsfall (Existenzprüfung in Skripten) konzipiert und liefert eine präzisere Ausgabe.
1. Grundlegende Überprüfung
Die einfachste Methode ist, die Ausgabe von command -v nach /dev/null umzuleiten und nur den Exit-Code zu überprüfen.
# Prüft, ob 'git' verfügbar ist.
# >/dev/null 2>&1 leitet sowohl stdout als auch stderr um, sodass keine Ausgabe erscheint.
if command -v git >/dev/null 2>&1; then
echo "Git ist installiert."
else
echo "Fehler: Git ist nicht installiert. Bitte installieren Sie es." >&2
exit 1
fi
Kurzform
Die { ... }-Syntax kann als Alternative zu einem then-Block verwendet werden.
command -v git >/dev/null 2>&1 || {
echo "Fehler: Git ist nicht installiert." >&2;
exit 1;
}
2. Wiederverwendbare Funktion
Für Skripte mit mehreren Abhängigkeiten ist eine Helferfunktion sinnvoll.
#!/usr/bin/env bash
set -e
# Prüft, ob alle übergebenen Befehle existieren.
# Bricht mit einer Fehlermeldung ab, falls ein Befehl fehlt.
require_commands() {
for cmd in "$@"; do
if ! command -v "$cmd" >/dev/null 2>&1; then
echo "Fehler: Das erforderliche Programm '$cmd' ist nicht installiert oder nicht im PATH." >&2
exit 1
fi
done
}
# Verwendung der Funktion
require_commands curl jq git
echo "Alle Abhängigkeiten sind erfüllt. Skript wird fortgesetzt..."
# ... weitere Skriptlogik ...
3. Fallback-Implementierung (Fallback)
Manchmal möchten Sie eine alternative Implementierung verwenden, wenn ein bestimmtes Programm nicht vorhanden ist. Dies ist häufig bei GNU- vs. BSD-Tools der Fall (z.B. gdate vs. date auf macOS).
# Definiert eine Funktion, die 'gdate' (GNU date) bevorzugt, aber auf 'date' zurückfällt.
get_iso_date() {
if command -v gdate >/dev/null 2>&1; then
gdate --iso-8601=seconds
else
date -u +"%Y-%m-%dT%H:%M:%SZ"
fi
}
# Verwendung
CURRENT_TIME=$(get_iso_date)
echo "Aktuelle ISO-Zeit: $CURRENT_TIME"
Fazit
Die Verwendung von command -v ist die robusteste und portabelste Methode, um die Verfügbarkeit von externen Befehlen in Bash-Skripten zu überprüfen. Durch die Integration dieser Prüfungen zu Beginn Ihrer Skripte stellen Sie sicher, dass diese auf verschiedenen Systemen vorhersagbar und benutzerfreundlich sind.