Standardeingabe über das BashSkript

Möchte man eine die Eingabe für ein Programm gleich im Skript halten, so erlauben die Dateiumleitungen das Einlesen von Daten aus einer Datei. Nun könnte man die Eingabe erst in eine Datei schreiben und diese dann wieder einlesen:

echo "Hallo proggen.org" > datei.txt
cat < datei.txt

Die Der Pipe-Operator bietet sich hier natürlich auch an:

echo "Hallo proggen.org" | cat;

Doch es gibt noch eine dritte Möglichkeit, die gerade wenn es um lange Texte oder Daten geht, komfortabler ist: Die sogenannten HERE-Skripts. Hierbei werden Daten bis zu einem bekannten Endpunkt geschrieben. Die Eingaben werden direkt ins Skript geschrieben. Dies geht mit dem „«“-Operator:

cat << ENDOFDATA
Hallo proggen.org
ENDOFDATA

Hier wird bis zum Vorkommen der Zeichenkette ENDOFDATA alles in die Standardeingabe von cat gepumpt. Wichtig ist hierbei natürlich, dass der Text ENDOFDATA im Datenbereich nicht vorkommt.

Dabei werden auch automatisch Substitutionen durchgeführt:

USER="proggen.org"
 
cat << ENDOFDATA
Hallo $USER
ENDOFDATA

ergibt Hallo proggen.org.

Möchte man Variablen-Substitutionen vermeiden, so setzt man die Endmarke nach dem „«“-Operator in Anführungszeichen:

USER="proggen.org"
 
cat << 'ENDOFDATA'
Hallo $USER
ENDOFDATA

ergibt Hallo $USER.

Die Daten werden genauso übertragen, wie sie im Skript stehen. Das bedeutet, das voranstehende Leerzeichen und Tabulatoren ebenfalls so übertragen werden. Die BaSh kann diese voranstehenden Whitespaces herausfiltern, wenn hierfür der „«-“-Operator verwendet wird.

Komplexeres Beispiel

Nützlich ist diese Art Eingabe zum Beispiel beim Arbeiten mit einer chroot Umgebung innerhalb eines Skripts.

cp /etc/resolv.conf ort/etc
mount -t proc -o bind /proc ort/proc
mount -o bind /dev/pts ort/dev/pts
chroot ort/ /bin/bash <<EOF
    touch dummy.txt
    ls -la
    rm dummy.txt
    exit
EOF
umount ort/proc
umount ort/dev/pts
rm ort/etc/resolv.conf

Dies eignet sich zum Beispiel zur Skript-gesteuerten Bearbeitung von LiveCD-Images.