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 Pipe 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.
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.