Robustes Bash-Grundgerüst mit set -euo pipefail
Ein Shell-Skript, das bei Fehlern einfach weiterläuft, ist gefährlich. Mit set -euo pipefail und einem sauberen Grundgerüst bricht dein Skript beim ersten Problem sicher ab.
Standardmäßig macht Bash bei einem Fehler einfach weiter. Für ein Deploy- oder Backup-Skript ist das riskant: Ein fehlgeschlagener Schritt bleibt unbemerkt, und der nächste läuft auf halbfertigem Zustand. Deshalb beginnt bei mir jedes ernsthafte Skript mit derselben Kopfzeile.
Das Grundgerüst
#!/usr/bin/env bash
set -euo pipefail
IFS=$'\n\t'
# -e : bricht ab, sobald ein Befehl fehlschlägt
# -u : bricht ab, wenn eine nicht gesetzte Variable benutzt wird
# -o pipefail : eine Pipe schlägt fehl, wenn IRGENDEIN Teil fehlschlägt
main() {
local ziel="${1:-}"
if [[ -z "$ziel" ]]; then
echo "Verwendung: $0 <ziel>" >&2
exit 1
fi
echo "Verarbeite: $ziel"
# ... deine Logik ...
}
main "$@"Warum jedes Flag zählt
-estoppt das Skript beim ersten fehlgeschlagenen Befehl, statt blind weiterzulaufen.-udeckt Tippfehler in Variablennamen auf:$zeilstatt$zielbricht sofort ab, statt still ins Leere zu greifen.-o pipefailsorgt dafür, dasscat datei | grep musterauch dann fehlschlägt, wenn schoncatscheitert – ohne dieses Flag zählt nur der letzte Befehl der Pipe.
Das IFS=$'\n\t' entfernt das Leerzeichen aus dem Feldtrenner, damit Dateinamen mit Leerzeichen nicht unbeabsichtigt zerteilt werden.
Aufräumen mit trap
Wenn dein Skript temporäre Dateien anlegt, räumst du sie mit trap auch dann auf, wenn es abbricht:
tmp="$(mktemp)"
trap 'rm -f "$tmp"' EXITKleiner Hinweis: set -e hat ein paar Sonderfälle (etwa in if-Bedingungen), aber als Grundgerüst macht diese Kopfzeile deine Skripte sofort deutlich sicherer.
Mit solchen kleinen Deploy- und Automatisierungsskripten halte ich die Websites meiner Kundinnen und Kunden am Laufen. Wenn du Unterstützung bei App, Website oder Automatisierung brauchst, findest du mich auf bymw.de.
Quellen
Du brauchst mehr als ein Snippet?
Ich entwickle Android-Apps in Kotlin und moderne Websites für Selbstständige und kleine Unternehmen — von der ersten Idee bis zum Release.
Projekt anfragen →Verwandte Rezepte
Upsert in SQLite mit ON CONFLICT DO UPDATE
Einfügen oder aktualisieren in einem einzigen Statement – mit ON CONFLICT ... DO UPDATE. Kein vorheriges SELECT, kein Race Condition zwischen Prüfen und Schreiben.
Responsives Karten-Grid ganz ohne Media Queries
Mit repeat(auto-fill, minmax()) baust du ein Grid, das die Spaltenzahl selbst an die Breite anpasst. Ein einziger Deklarationsblock ersetzt einen Stapel Media Queries.
fetch() mit async/await und sauberem try/catch
Daten von einer API holen ist mit fetch() und async/await lesbar wie synchroner Code. Der Haken: fetch wirft bei 404 oder 500 keinen Fehler – du musst response.ok selbst prüfen.