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. BEGRENZERist ein frei waehlbares Schluesselwort. Ueblich sindEOF(End Of File) oderEND.- 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:
<<BEGRENZERfuer normalen Heredoc mit Variablen-Ersetzung<<"BEGRENZER"um Variablen-Ersetzung zu deaktivieren<<-BEGRENZERum fuehrende Tabulatoren zu ignorieren- Kombination mit Umleitungen (
>,>>) und Pipes (|) moeglich