5.4 Umlenken mit dem Befehl exec
Mit dem Befehl exec können Sie sämtliche Ein- bzw. Ausgaben von Kommandos eines Shellscripts umleiten. Hier die Syntax:
# Standardausgabe nach Ausgabedatei umlenken
exec >Ausgabedatei
# Standardausgabe nach Ausgabedatei umlenken
# und ans Ende der Datei anfügen
exec >>Ausgabedatei
# Standardfehlerausgabe nach Ausgabedatei umlenken
exec 2>Fehler_Ausgabedatei
# Standardfehlerausgabe nach Ausgabedatei umlenken
# und ans Ende der Datei anfügen
exec 2>>Fehler_Ausgabedatei
# Standardeingabe umlenken
exec <Eingabedatei
Hierzu ein einfaches Beispiel:
# Demonstriert eine Umlenkung mit exec
# aexec1
# Wird noch auf dem Bildschirm ausgegeben
echo "$0 wird ausgeführt"
exec >ausgabe.txt
# Alle Ausgaben ab hier in die Datei "ausgabe.txt"
val=`ls -l | wc -l`
echo "Im Verzeichnis $HOME befinden sich $val Dateien"
echo "Hier der Inhalt: "
ls -l
Das Script bei der Ausführung:
you@host > ./aexec1
./aexec1 wird ausgeführt
you@host > cat ausgabe.txt
Im Verzeichnis /home/tot befinden sich 44 Dateien
Hier der Inhalt:
insgesamt 1289
-rwxr--r-- 1 tot users 188 2005–02–24 04:31 acase1
-rw-r--r-- 1 tot users 277 2005–02–24 02:44 acase1~
-rwxr--r-- 1 tot users 314 2005–03–06 11:17 aecho1
...
Die Ausführung des Scripts ist einfach. Die komplette Standardausgabe wird hier mittels
exec >ausgabe.txt
in die Datei ausgabe.txt umgeleitet. Alles, was sich vor dieser Zeile befindet, wird noch wie gewöhnlich auf dem Bildschirm ausgegeben. Wollen Sie im Beispiel eventuell auch auftretende Fehlermeldungen in eine Datei umleiten, können Sie exec wie folgt erweitern:
exec >ausgabe.txt 2>fehlerausgabe.txt
Jetzt werden auftretende Fehlermeldungen ebenfalls in eine separate Datei namens fehlerausgabe.txt geschrieben.
Die Umlenkung der Eingabe erfolgt nach demselben Schema. Alle entsprechenden Eingabekommandos erhalten dann ihre Daten aus einer entsprechenden Datei.
# Demonstriert eine Umlenkung mit exec
# aexec2
# Alle Eingaben im Script werden hier von data.dat entnommen
exec <data.dat
printf "%-15s %-15s %-8s\n" "Nachname" "Vorname" "Telefon"
printf "+%-15s+%-15s+%-8s\n" "--------" "-------" "-------"
while read vorname nachname telefon
do
printf " %-15s %-15s %-8d\n" $nachname $vorname $telefon
done
Das Script bei der Ausführung:
you@host > cat data.dat
Jürgen Wolf 1234
Frank Zane 3213
Mike Katz 3213
Mike Mentzer 1343
you@host > ./aexec2
Nachname Vorname Telefon
+-------- +------- +-------
Wolf Jürgen 1234
Zane Frank 3213
Katz Mike 3213
Mentzer Mike 1343
Bitte beachten Sie aber, dass jedes Kommando an der Position des letzten Lesekommandos fortfährt. Würden Sie z. B. im Script »axec2« beim ersten Schleifendurchlauf abbrechen und anschließend einen erneuten Durchlauf starten, so würde der zweite Durchlauf dort weitermachen, wo sich der erste Durchlauf beendet hat, beispielsweise würden Sie mit dem leicht modifizierten Script »axec3« dasselbe erreichen wie mit »axec2«.
# Demonstriert eine Umlenkung mit exec
# aexec3
# Wird noch auf dem Bildschirm ausgegeben
echo "$0 wird ausgeführt"
# Alle Eingaben im Script werden hier von data.dat entnommen
exec <data.dat
printf "%-15s %-15s %-8s\n" "Nachname" "Vorname" "Telefon"
printf "+%-15s+%-15s+%-8s\n" "--------" "-------" "-------"
while read vorname nachname telefon
do
printf " %-15s %-15s %-8d\n" $nachname $vorname $telefon
break # Hier wird testweise nach einem Durchlauf abgebrochen
done
while read vorname nachname telefon
do
printf " %-15s %-15s %-8d\n" $nachname $vorname $telefon
done
Dass dies so ist, liegt am Filedeskriptor, welcher in seinem Dateitabelleneintrag u. a. auch die aktuelle Lese-/Schreibposition enthält. Zu den Filedeskriptoren kommen wir gleich im nächsten Abschnitt.
Den Vorteil der Verwendung von exec kann man hier zwar nicht auf den ersten Blick erkennen. Doch spätestens bei etwas längeren Scripts, bei denen Sie angesichts vieler Befehle eine Umlenkung der Ausgabe vornehmen müssen/wollen, wird Ihnen eine Menge Tipparbeit mit exec abgenommen. Anstatt hinter jede Befehlszeile das Umlenkungszeichen für die Standard- und Fehlerausgabe zu setzen, können Sie mit einem einfachen exec-Aufruf einen Filedeskriptor während der Scriptausführung komplett in eine andere Richtung umlenken.
Ihre Meinung
Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.
|