TASIOMIND.DEV — OPERATIONAL▸▸▸FULL STACK DEVELOPER @ GWQ SERVICEPLUS AG▸▸▸FOUNDER — K8SGPT.AI▸▸▸OPEN SOURCE: ACTIVE▸▸▸DISTRIBUTED SYSTEMS / KUBERNETES / AI▸▸▸RUST + GO + PYTHON▸▸▸FIELD TESTED / STATUS — NOMINAL▸▸▸LOCATION: EUROPE/BERLIN▸▸▸TASIOMIND.DEV — OPERATIONAL▸▸▸FULL STACK DEVELOPER @ GWQ SERVICEPLUS AG▸▸▸FOUNDER — K8SGPT.AI▸▸▸OPEN SOURCE: ACTIVE▸▸▸DISTRIBUTED SYSTEMS / KUBERNETES / AI▸▸▸RUST + GO + PYTHON▸▸▸FIELD TESTED / STATUS — NOMINAL▸▸▸LOCATION: EUROPE/BERLIN▸▸▸

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 im PATH). Er gibt bei Erfolg den Pfad zur ausführbaren Datei oder den Alias/die Funktion zurück und hat einen Exit-Code von 0. Bei Misserfolg gibt er nichts aus und hat einen Exit-Code ungleich 0.
  • which: Ein externes Programm, dessen Verhalten zwischen verschiedenen Systemen variieren kann. Es durchsucht nur den PATH und 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, aber command -v ist 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.

code
# 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.

code
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.

code
#!/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).

code
# 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.