MWCodebymw.de ↗
Terminal

Heredocs in Bash – mehrzeilige Texte, Konfigurationen und SQL ohne Echo-Wüste

Zwanzig echo-Zeilen für eine Konfigurationsdatei sind mühsam und fehleranfällig. Ein Heredoc schreibt den Text so, wie er aussehen soll – mit oder ohne Variablen, je nachdem, wie du den Marker schreibst.

Mehrzeilige Ausgabe mit echo zu bauen, endet immer gleich: irgendwo fehlt ein \n, irgendwo ein Anführungszeichen. Ein Heredoc nimmt den Text am Stück.

Die Grundform

cat > /etc/meinapp.conf <<CONF
port = 8080
logdir = /var/log/meinapp
debug = false
CONF

Alles zwischen <<CONF und der Zeile mit CONF landet in der Datei. Der Marker ist frei wählbar – Hauptsache, er kommt im Text nicht vor.

Mit oder ohne Variablen – der entscheidende Unterschied

name="Michael"

cat <<TEXT                # Variablen werden ersetzt
Hallo $name, heute ist $(date +%A).
TEXT

cat <<'TEXT'              # Marker in Anführungszeichen: nichts wird ersetzt
Preis: $9.99 – und $HOME bleibt $HOME.
TEXT

Die zweite Form ist die richtige für alles, was Dollarzeichen enthält: Skripte, die du schreibst, AWK-Programme, Vorlagen mit Platzhaltern.

Eingerückt schreiben mit <<-

sichern() {
	cat <<-SQL | sqlite3 daten.db
		DELETE FROM sitzungen WHERE ablauf < unixepoch();
		VACUUM;
	SQL
}

<<- entfernt führende Tabulatoren (keine Leerzeichen!) – damit bleibt der Code eingerückt, ohne dass die Einrückung in der Ausgabe landet.

Herestring: wenn eine Zeile reicht

jq '.name' <<< "$json"
read -r jahr monat <<< "2026 09"
grep -c fehler <<< "$protokoll"

<<< schiebt einen einzelnen String auf die Standardeingabe – kürzer als echo "$x" | und ohne zusätzlichen Prozess.

Praktisch: Mail, SSH und Dateien in einem Rutsch

ssh server <<'FERN'
  cd /srv/app
  git pull --ff-only
  systemctl --user restart app
FERN

mail -s "Nachtlauf fertig" ich@example.com <<BERICHT
Verarbeitet: $anzahl Dateien
Dauer: $((SECONDS / 60)) Minuten
Fehler: ${fehler:-keine}
BERICHT

Fallstrick

Der schließende Marker muss allein in einer Zeile stehen, ohne Leerzeichen davor (außer bei <<-, und dort nur mit Tabs) und ohne irgendetwas dahinter – sonst liest die Shell den Rest des Skripts als Text und meldet erst am Dateiende einen Fehler. Und beim Verschachteln: Zwei Heredocs mit demselben Marker im selben Skript vertragen sich nicht; nimm sprechende Namen wie SQL, CONF, MAIL.

Automatisierung, Deployment-Skripte und Nachtläufe schreibe ich regelmäßig – wenn bei dir noch vieles von Hand läuft: bymw.de.

Quellen

#Bash#Heredoc#Dateien#Konfiguration#Skripte

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 →