Verwendung von Here Documents in Bash
April 19, 2018
Ein Here Document (Here-Doc) ist eine spezielle Art der Umleitung in der Shell, die es ermöglicht, einem Befehl einen mehrzeiligen String als Standardeingabe (stdin) zu übergeben. Dies ist besonders nützlich, um Konfigurationsdateien zu erstellen, mehrzeilige Nachrichten auszugeben oder eine Sequenz von Befehlen an ein anderes Programm wie ssh zu senden.
Grundlegende Syntax
Die Syntax verwendet den << Operator, gefolgt von einem Delimiter. Der Delimiter ist ein frei wählbares Wort, das den Anfang und das Ende des Textblocks markiert.
befehl << DELIMITER
Zeile 1
Zeile 2
...
DELIMITER
Wichtige Regeln:
- Der öffnende Delimiter folgt direkt nach
<<. - Der schließende Delimiter muss am Anfang einer Zeile stehen, ohne führende Leerzeichen oder Tabulatoren.
1. Here-Doc mit Variablen-Expansion (Standard)
Standardmäßig werden Variablen und Befehlssubstitutionen innerhalb eines Here-Docs expandiert (ausgewertet).
Beispiel:
#!/usr/bin/env bash
USERNAME=$USER
FILENAME="config.txt"
# Erstellt eine Datei mit dynamischem Inhalt
cat << EOF > "$FILENAME"
# Konfigurationsdatei für Benutzer: ${USERNAME}
# Erstellt am: $(date)
# Hier könnten weitere Einstellungen folgen...
EOF
echo "Datei '$FILENAME' wurde erstellt."
In diesem Beispiel werden ${USERNAME} und $(date) durch ihre jeweiligen Werte ersetzt.
2. Here-Doc ohne Variablen-Expansion (Literal)
Wenn der Delimiter in Anführungszeichen (einfach oder doppelt) gesetzt wird, wird die Expansion von Variablen und Befehlen unterdrückt. Der Inhalt wird als literaler String behandelt.
Beispiel:
#!/usr/bin/env bash
# Erstellt ein Skript, das selbst Variablen enthält
cat << 'EOF' > mein_skript.sh
#!/usr/bin/env bash
# Dieses Skript wird erst später ausgeführt
# Die Variable $USER wird hier nicht expandiert, sondern als Text geschrieben
echo "Hallo, \$USER"
EOF
chmod +x mein_skript.sh
Die Verwendung von 'EOF' verhindert, dass $USER sofort ausgewertet wird.
3. Anwendungsbeispiel: Remote-Befehle mit ssh
Here Documents sind ideal, um eine Reihe von Befehlen auf einem entfernten Server über ssh auszuführen.
#!/usr/bin/env bash
REMOTE_USER="admin"
REMOTE_HOST="server.example.com"
ssh "${REMOTE_USER}@${REMOTE_HOST}" << 'EOF'
# Diese Befehle werden auf dem entfernten Server ausgeführt
echo "Aktualisiere System..."
sudo apt-get update -y
sudo apt-get upgrade -y
echo "Update abgeschlossen."
echo "Hostname: $(hostname)"
EOF
Die Verwendung von 'EOF' ist hier wichtig, damit Befehlssubstitutionen wie $(hostname) auf dem entfernten Server und nicht auf dem lokalen Rechner ausgeführt werden.
Fazit
Here Documents sind ein äußerst nützliches Feature in Bash für die Erstellung von Skripten, die mit mehrzeiligen Textblöcken arbeiten. Die Unterscheidung zwischen expandierenden und nicht-expandierenden Here-Docs (durch das Quoting des Delimiters) ist entscheidend für die korrekte Anwendung.