Ein Heredoc (Here Document) ist eine spezielle Umleitungsform in Bash, mit der du mehrzeiligen Text direkt an einen Befehl uebergeben kannst. Das ist besonders nuetzlich, wenn du in Shell-Skripten laengere Textbloecke verarbeiten oder an interaktive Programme wie cat, ssh oder sftp senden moechtest.

Syntax

Die grundlegende Syntax eines Heredocs sieht folgendermassen aus:

befehl <<BEGRENZER
Text Zeile 1
Text Zeile 2
BEGRENZER
  • Der Umleitungsoperator << leitet den folgenden Textblock an den Befehl weiter.
  • BEGRENZER ist ein frei waehlbares Schluesselwort. Ueblich sind EOF (End Of File) oder END.
  • Der Textblock beginnt nach der ersten Zeile und endet, sobald der Begrenzer alleine in einer Zeile steht.
  • Der abschliessende Begrenzer darf keine fuehrenden Leerzeichen haben.

Variablen und Befehle im Heredoc

Standardmaessig ersetzt Bash Variablen und fuehrt Befehlssubstitutionen innerhalb des Heredocs aus:

cat <<EOF
Aktuelles Verzeichnis: $PWD
Angemeldeter Benutzer: $(whoami)
EOF

Ausgabe:

Aktuelles Verzeichnis: /home/benutzer
Angemeldeter Benutzer: benutzer

Variablen-Ersetzung deaktivieren

Wenn du den Begrenzer in Anfuehrungszeichen setzt, werden Variablen und Befehle nicht ersetzt:

cat <<"EOF"
Variable: $PWD
Befehl: $(whoami)
EOF

Ausgabe:

Variable: $PWD
Befehl: $(whoami)

Das ist nuetzlich, wenn du Skript-Code oder Text mit Dollarzeichen ausgeben moechtest, ohne dass Bash diese interpretiert.

Einrueckung mit «-

In Shell-Skripten ist der Code oft eingerueckt. Mit dem Operator <<- (Bindestrich nach den Kleiner-als-Zeichen) ignoriert Bash fuehrende Tabulatoren im Heredoc:

if true; then
	cat <<-EOF
	Diese Zeile ist mit Tab eingerueckt.
	Der Tab wird in der Ausgabe entfernt.
	EOF
fi

Ausgabe:

Diese Zeile ist mit Tab eingerueckt.
Der Tab wird in der Ausgabe entfernt.

Beachte: Nur Tabulatoren werden entfernt, keine Leerzeichen.

Ausgabe in eine Datei schreiben

Du kannst die Heredoc-Ausgabe direkt in eine Datei umleiten:

cat <<EOF > config.txt
server=localhost
port=8080
debug=true
EOF

Mit > wird die Datei ueberschrieben, mit >> wird der Text angehaengt.

Heredoc mit Pipes

Heredocs lassen sich mit anderen Befehlen ueber Pipes verbinden:

cat <<EOF | grep "fehler"
info: System gestartet
fehler: Verbindung fehlgeschlagen
info: Neuversuch
EOF

Ausgabe:

fehler: Verbindung fehlgeschlagen

Heredoc mit SSH

Heredocs sind praktisch, um mehrere Befehle auf einem Remote-Server auszufuehren:

ssh benutzer@server <<EOF
cd /var/log
ls -la
tail -n 20 syslog
EOF

Bei unquotiertem Begrenzer werden lokale Variablen vor dem Senden ersetzt. Um Remote-Variablen zu verwenden, setze den Begrenzer in Anfuehrungszeichen oder escape die Variablen mit Backslash:

ssh benutzer@server <<"EOF"
echo "Remote-Verzeichnis: $PWD"
echo "Remote-Benutzer: $(whoami)"
EOF

Zusammenfassung

Heredocs bieten eine uebersichtliche Moeglichkeit, mehrzeiligen Text in Bash-Skripten zu verarbeiten. Die wichtigsten Punkte:

  • <<BEGRENZER fuer normalen Heredoc mit Variablen-Ersetzung
  • <<"BEGRENZER" um Variablen-Ersetzung zu deaktivieren
  • <<-BEGRENZER um fuehrende Tabulatoren zu ignorieren
  • Kombination mit Umleitungen (>, >>) und Pipes (|) moeglich