Rheinwerk Computing < openbook > Rheinwerk Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger.

 << zurück
Shell-Programmierung von Jürgen Wolf
Einführung, Praxis, Referenz
Buch: Shell-Programmierung

Shell-Programmierung
782 S., mit CD, 44,90 Euro
Rheinwerk Computing
ISBN 3-89842-683-1
gp Kapitel 5 Terminal-Ein- und Ausgabe
  gp 5.1 Von Terminals zu Pseudo-Terminals
  gp 5.2 Ausgabe
    gp 5.2.1 Der echo-Befehl
    gp 5.2.2 print (Korn-Shell only)
    gp 5.2.3 Der Befehl printf
    gp 5.2.4 Der Befehl tput – Terminalsteuerung
  gp 5.3 Eingabe
    gp 5.3.1 Der Befehl read
    gp 5.3.2 (Zeilenweise) Lesen einer Datei mit read
    gp 5.3.3 Zeilenweise mit einer Pipe aus einem Kommando lesen (read)
    gp 5.3.4 Here-Dokumente (Inline-Eingabeumleitung)
    gp 5.3.5 Here-Dokumente mit read verwenden
    gp 5.3.6 Die Variable IFS
    gp 5.3.7 Arrays einlesen mit read (Bash und Korn-Shell only)
    gp 5.3.8 Shell-abhängige Anmerkungen zu read
    gp 5.3.9 Einzelnes Zeichen abfragen
    gp 5.3.10 Einzelne Zeichen mit Escape-Sequenzen abfragen
    gp 5.3.11 Passworteingabe
  gp 5.4 Umlenken mit dem Befehl exec
  gp 5.5 Filedeskriptoren
    gp 5.5.1 Einen neuen Filedeskriptor verwenden
    gp 5.5.2 Die Umlenkung <>
  gp 5.6 Named Pipes
  gp 5.7 Menüs mit select (Bash und Korn-Shell only)
  gp 5.8 dialog und Xdialog
    gp 5.8.1 Entscheidungsfrage --yesno
    gp 5.8.2 Nachrichtenbox mit Bestätigung --msgbox
    gp 5.8.3 Hinweisfenster ohne Bestätigung --infobox
    gp 5.8.4 Text-Eingabezeile --inputbox
    gp 5.8.5 Ein einfacher Dateibetrachter --textbox
    gp 5.8.6 Ein Menü --menu
    gp 5.8.7 Auswahlliste zum Ankreuzen --checklist
    gp 5.8.8 Radiobuttons zum Auswählen --radiolist
    gp 5.8.9 Fortschrittszustand anzeigen --gauge
    gp 5.8.10 Verändern von Aussehen und Ausgabe
    gp 5.8.11 Kleines Beispiel
    gp 5.8.12 Zusammenfassung
  gp 5.9 gnuplot – Visualisierung von Messdaten
    gp 5.9.1 Wozu wird gnuplot eingesetzt?
    gp 5.9.2 gnuplot starten
    gp 5.9.3 Das Kommando zum Plotten
    gp 5.9.4 Variablen und Parameter für gnuplot
    gp 5.9.5 Ausgabe von gnuplot umleiten
    gp 5.9.6 Variablen und eigene Funktionen definieren
    gp 5.9.7 Interpretation von Daten aus einer Datei
    gp 5.9.8 Alles bitte nochmals zeichnen (oder besser speichern und laden)
    gp 5.9.9 gnuplot aus einem Shellscript heraus starten (der Batch-Betrieb)
    gp 5.9.10 Plot-Styles und andere Ausgaben festlegen
    gp 5.9.11 Tricks für die Achsen
    gp 5.9.12 Die dritte Dimension
    gp 5.9.13 Zusammenfassung


Rheinwerk Computing

5.5 Filedeskriptoredowntop

Der exec-Befehl ist der Grundstein für diesen Abschnitt. Ein Filedeskriptor ist ein einfacher ganzzahliger Wert, welcher sich in einer bestimmten Tabelle von geöffneten Dateien befindet, und der vom Kernel für jeden Prozess bereitgestellt wird. Die Werte 0, 1 und 2 sind vorbelegte Filedeskriptoren und Verweise auf die Standardeingabe (stdin), Standardausgabe (stdout) und Standardfehlerausgabe (stderr). Diese drei Filedeskriptoren sind meist mit dem Terminal (TTY) des Anwenders verbunden und können natürlich auch umgeleitet werden, was Sie ja schon des Öfteren getan haben.

Somit haben Sie also auch schon mit Filedeskriptoren (ob nun bewusst oder unbewusst) gearbeitet. Haben Sie z. B. eine Umlenkung wie

ls -l > Augabedatei

vorgenommen, dann haben Sie praktisch den Kanal 1 oder genauer den Filedeskriptor 1 für die Standardausgabe in entsprechende Ausgabedatei umgeleitet. Ähnlich war dies auch bei der Standardeingabe mit dem Kanal 0, genauer dem Filedeskriptor mit der Nummer 0:

write user <nachricht

In beiden Fällen hätten Sie auch die alternative Schreibweise

ls -l 1> Ausgabedatei
write user 0<nachricht

verwenden können, aber dies ist bei den Kanälen 0 und 1 nicht erforderlich und optional, da diese vom System bei Verwendung ohne eine Ziffer mit entsprechenden Werten belegt werden. Aber ab dem Kanal 2, der Standardfehlerausgabe, muss schon die Filedeskriptoren-Nummer mit angegeben werden, da das System sonst statt Kanal 2 den Kanal 1 verwenden würde. Es hindert Sie aber niemand, statt der Standardausgabe (Kanal 1) die Standardfehlerausgabe (Kanal 2) zu verwenden. Hierzu müssen Sie nur den entsprechenden Ausgabebefehl anweisen, seine Standardausgabe auf den Kanal 2 vorzunehmen:

you@host > echo "Hallo Welt auf stderr" >&2
Hallo Welt auf stderr

Gleiches haben Sie ja schon öfter mit der Standardfehlerausgabe mittels 2>&1 vorgenommen. Hierbei wurde die Standardfehlerausgabe (Kanal 2) auf den Filedeskriptor 1 umgelenkt. Damit hatten Fehlerausgabe und Standardausgabe dasselbe Ziel. Somit lautet die Syntax, um aus einer Datei bzw. einem Filedeskriptor zu lesen oder zu schreiben, wie folgt:

# Lesen aus einer Datei bzw. Filedeskriptor
kommando <&fd
# Schreiben in eine Datei bzw. Filedeskriptor
kommando >&fd
# Anhängen in eine Datei bzw. Filedeskriptor
kommanod >>&fd

Rheinwerk Computing

5.5.1 Einen neuen Filedeskriptor verwenden  downtop

Selbstverständlich können Sie neben den Standardkanälen weitere Filedeskriptoren erzeugen. Für die Namen stehen Ihnen hierzu die Nummern 3 bis 9 zur Verfügung. Dabei wird der exec-Befehl folgendermaßen verwendet (für fd steht Ihnen eine Zahl zwischen 3 und 9 zur Verfügung):

# Zusätzlicher Ausgabekanal
exec fd> ziel
# Zusätzlicher Ausgabekanal zum Anhängen
exec fd>> ziel
# Zusätzlicher Eingabekanal
exec fd< ziel

Im folgenden Beispiel erzeugen wir einen neuen Ausgabekanal für die aktuelle Konsole mit der Nummer 3:

you@host > exec 3> `tty`
you@host > echo "Hallo neuer Kanal" >&3
Hallo neuer Kanal

Wenn Sie einen Filedeskriptor nicht mehr benötigen, sollten Sie diesen wieder freigeben. Auch hierbei wird wieder das exec-Kommando genutzt:

exec fd>&-

Auf den Filedeskriptor 3 bezogen, den Sie eben erzeugt haben, sieht dieser Vorgang wie folgt aus:

you@host > exec 3>&-
you@host > echo "Hallo neuer Kanal" >&3
bash: 3: Ungültiger Dateideskriptor

Hinweis   Behalten Sie immer im Hinterkopf, dass ein neu von Ihnen erzeugter Kanal auch den weiteren Subshells zur Verfügung steht.

Hinweis   Verwenden Sie exec >&- ohne Angabe eines Kanals, wird hier die Standardausgabe geschlossen. Gleiches gilt auch für Kanal 0 und 2 mit exec <&- (schließt die Standardeingabe) und exec 2>&- (schließt die Standardfehlerausgabe).


Es wurde bereits im Abschnitt zuvor erwähnt, dass jedes Kommando an der Position des letzten Lese-/Schreibzugriffs fortfährt. Diesen Sachverhalt nutzt man in der Praxis in drei Hauptanwendungsgebieten.

Offenhalten von Dateien

Würden Sie z. B. zweimal über eine Umlenkung etwas von einer Datei oder Kommando-Substitution lesen, würde zweimal dasselbe eingelesen, beispielsweise:

you@host > who
you      tty2         Mar  6 14:09
tot      :0           Mar  5 12:21 (console)
you@host > who > user.dat
you@host > read user1 <user.dat
you@host > read user2 <user.dat
you@host > echo $user1
you tty2 Mar 6 14:09
you@host > echo $user2
you tty2 Mar 6 14:09

Hier war wohl nicht beabsichtigt, dass zweimal derselbe User eingelesen wird. Verwenden Sie hingegen einen neuen Kanal, bleibt Ihnen die aktuelle Position des Lesezeigers erhalten. Dasselbe mit einem neuen Filedeskriptor:

you@host > who > user.dat
you@host > exec 3< user.dat
you@host > read user1 <&3
you@host > read user2 <&3
you@host > echo $user1
you tty2 Mar 6 14:09
you@host > echo $user2
tot :0 Mar 5 12:21 (console)

Lesen aus mehreren Dateien

Das Prinzip ist recht einfach: Sie verwenden einfach mehrere Filedeskriptoren, lesen die Werte jeweils zeilenweise in eine Variable ein (am besten in einer Schleife) und werten dann entsprechende Daten aus (bspw. einen Durchschnittswert).

...
exec 3< file1
exec 4< file2
exec 5< file3
exec 6< file4
while true
do
   read var1 <&3
   read var2 <&4
   read var3 <&5
   read var4 <&6
   # Hier die Variablen überprüfen und verarbeiten
done

Lesen von der Standardeingabe und einer Datei

Dies ist ein häufiger Anwendungsfall. Wurde eine Datei zum Lesen geöffnet und stellt man gleichzeitig auch Anfragen an den Benutzer, würde bei einer Verwendung von read sowohl von der Datei als auch von der Benutzereingabe gelesen, z. B.:

# Demonstriert eine Umlenkung mit exec
# aexec4
exec 3< $1
while read line <&3
do
   echo $line
   printf "Eine weitere Zeile einlesen? [j/n] : "
   read
   [ "$REPLY" = "n" ] && break
done

Das Script bei der Ausführung:

you@host > ./aexec4 zitat.txt
Des Ruhmes Würdigkeit verliert an Wert,
Eine weitere Zeile einlesen? [j/n] : n

Ohne einen neuen Filedeskriptor würde im eben gezeigten Beispiel beim Betätigen von »j« immer wieder mit der ersten Zeile der einzulesenden Datei begonnen. Testen Sie es am besten selbst.


Hinweis   Natürlich lässt sich mit einem Filedeskriptor noch mehr anstellen als hier beschrieben, doch dürften dies schon die Hauptanwendungsgebiete sein. Ein weiteres Beispiel habe ich Ihnen bereits bei der Fehlerauswertung von mehreren Befehlen in einer Kommandoverkettung bei einer Pipe demonstriert (siehe Abschnitt 4.1.2).



Rheinwerk Computing

5.5.2 Die Umlenkung <>  toptop

Neben den bisher bekannten Umlenkungszeichen gibt es noch ein etwas anderes, welches sich hier in Verbindung mit den Filedeskriptoren und dem exec-Befehl etwas einfacher erklären lässt. Mit dieser Umlenkung wird eine Datei sowohl zum Lesen als auch zum Schreiben geöffnet, und dies ist auch das Besondere daran, die Ausgabe wird exakt an derjenigen Stelle fortgeführt, an der sich im Augenblick der Lesezeiger befindet. Ebenso sieht es beim Schreiben aus – alle geschriebenen Daten landen genau dort, wo sich der Schreibzeiger im Augenblick befindet. Und noch etwas Besonderes beim Schreiben: Alle Daten hinter den neu geschriebenen Daten bleiben bestehen.

Hier ein einfaches Beispiel, welches demonstriert, wie Sie einen Filedeskriptor mit <> gleichzeitig zum Lesen und Schreiben verwenden können.

# Demonstriert eine Umlenkung mit exec und <>
# aexec5
exec 3<> $1
while read line <&3
do
   echo $line
   printf "Hier eine neue Zeile einfügen? [j/n] : "
   read
   [ "$REPLY" = "j" ] && break
done
printf "Bitte hier die neue Zeile eingeben : "
read
echo $REPLY >&3

Das Script bei der Ausführung:

you@host > ./aexec5 zitat.txt
Des Ruhmes Würdigkeit verliert an Wert,
Hier eine neue Zeile einfügen? [j/n] : j
Bitte hier die neue Zeile eingeben : Hier eine neue Zeile
you@host > cat zitat.txt
Des Ruhmes Würdigkeit verliert an Wert,
Hier eine neue Zeile
der selbst mit Lob sich ehrt.


Ihr Kommentar

Wie hat Ihnen das <openbook> gefallen? Wir freuen uns immer über Ihre freundlichen und kritischen Rückmeldungen.

>> Zum Feedback-Formular
 << zurück
  
  Zum Katalog
Zum Katalog: Shell-Programmierung
Shell-Programmierung
bestellen
 Buchtipps
Zum Katalog: Shell-Programmierung






 Shell-Programmierung


Zum Katalog: Linux-Server






 Linux-Server


Zum Katalog: Das Komplettpaket LPIC-1 & LPIC-2






 Das Komplettpaket
 LPIC-1 & LPIC-2


Zum Katalog: Linux-Hochverfügbarkeit






 Linux-
 Hochverfügbarkeit


Zum Katalog: Linux Handbuch






 Linux Handbuch


 Shopping
Versandkostenfrei bestellen in Deutschland und Österreich
InfoInfo





Copyright © Rheinwerk Verlag GmbH 2005
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


[Rheinwerk Computing]

Rheinwerk Verlag GmbH, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, service@rheinwerk-verlag.de