TASIOMIND.DEV — OPERATIONAL▸▸▸FULL STACK DEVELOPER @ GWQ SERVICEPLUS AG▸▸▸FOUNDER — K8SGPT.AI▸▸▸OPEN SOURCE: ACTIVE▸▸▸DISTRIBUTED SYSTEMS / KUBERNETES / AI▸▸▸RUST + GO + PYTHON▸▸▸FIELD TESTED / STATUS — NOMINAL▸▸▸LOCATION: EUROPE/BERLIN▸▸▸TASIOMIND.DEV — OPERATIONAL▸▸▸FULL STACK DEVELOPER @ GWQ SERVICEPLUS AG▸▸▸FOUNDER — K8SGPT.AI▸▸▸OPEN SOURCE: ACTIVE▸▸▸DISTRIBUTED SYSTEMS / KUBERNETES / AI▸▸▸RUST + GO + PYTHON▸▸▸FIELD TESTED / STATUS — NOMINAL▸▸▸LOCATION: EUROPE/BERLIN▸▸▸

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.

code
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:

code
#!/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:

code
#!/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.

code
#!/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.