Druckversion

Die Bash - Umleitung der Ein- und Ausgabe

Prozesse Weiter

Auch wenn auf Prozesse detailliert im folgenden Abschnitt eingegangen wird, so ist eine vereinfachte Erklärung des Begriffes für diesen Abschnitt unabdingbar.

Programme sind unter Unix ausführbare Objekte und liegen in Form von Dateien auf irgendeinem Speichermedium vor. Ein Prozess (man spricht oft auch von »Task«) ist nun ein Programm in Ausführung, wobei

  • Der Kode des Programms im Hauptspeicher liegt
  • Der Prozess einen Eintrag in der Prozesstabelle des Kernels besitzt
  • Der Prozess einen Stack, eine systemweit eindeutige Prozessnummer (PID), einen Befehlszeiger,... besitzt
  • Der Prozess hat einen Besitzer/eine besitzende Gruppe
  • Ein Prozess besitzt einen Elternprozess (einzige Ausnahme ist der erste Prozess »init«)
Typische Prozesse starten mit 3 offenen Dateien Zurück Anfang Weiter

Standardkanäle, die typische Prozesse öffnen

Abbildung 1: Typische Prozesse öffnen 3 Standardkanäle

Standardeingabe (0)

Laufende Programme erwarten von hier ihre Eingaben (normalerweise handelt es sich um die Tastatur).

Standardausgabe (1)

Programme schreiben auf diese ihre Ausgaben (Bildschirm).

Standardfehlerausgabe (2)

Fehlerausgaben landen hier (Bildschirm, aber nur die aktive Konsole).

Die drei Kanäle fasst man oft unter dem Begriff Standardkanäle zusammen und hat ein Prozess diese geöffnet, so sagt man: »er ist mit dem Terminal verbunden«.

Ein- und Ausgaben können umgeleitet werden Zurück Anfang Weiter

Eine solche Umleitung ist für die beteiligten Prozesse transparent, d.h. dem Prozess ist es letztlich egal, woher er seine Eingaben bezieht und wohin er seine Ausgaben schreibt. Als Ziel bzw. Quelle einer jeden Umleitung kommen entweder Dateien in Frage oder aber andere Prozesse. In letzterem Fall spricht man auch von »Pipelining«.

Zunächst fassen wir alle Möglichkeiten zur Umleitung von Ein- und Ausgaben zusammen:

< datei

Standardeingabe, Lesen aus »datei«

> datei

Standardausgabe, Schreiben in »datei«

2> datei

Standardfehlerausgabe, Schreiben der Fehler in »datei«

&> datei oder >& datei

Standard- und Standardfehlerausgabe, Schreiben in »datei«

>> datei

Standardausgabe, Anhängen an »datei«

Beispiele Zurück Anfang Weiter

user@sonne> ls -l > inhalt

schreibt die Ausgaben von »ls -l« in die Datei »inhalt«.

user@sonne> touch /etc/passwd 2> fehler

leitet die Standardfehlerausgabe (Wert 2) in die Datei »fehler«.

user@sonne> find /var -name "*.txt" >& datei

leitet Standard- und Standardfehlerausgabe in die Datei »datei« um.

user@sonne> mv ~/plumper_versuch /etc/passwd > fehler 2>&1

leitet Standard- und Standardfehlerausgabe in die Datei »fehler« um, wobei hier zunächst die Standardausgabe in die Datei »fehler« umgeleitet wird und nachfolgend die Standardfehlerausgabe dorthin gelenkt wird, wohin auch die Standardausgabe zeigt. In solchen Situationen ist die Reihenfolge der Umlenkung wichtig, da die Evaluierung von links nach rechts erfolgt. Ein Versuch des Vertauschens bewirkt Folgendes:

user@sonne> mv ~/plumper_versuch /etc/passwd 2>&1 > fehler
mv: kann reguläre Datei »/etc/passwd« nicht anlegen: Keine Berechtigung

Erläuterung: Im Augenblick der Umleitung der Fehlerausgabe zeigt die Standardausgabe noch auf den Bildschirm. Also zeigt die Fehlerausgabe nun ebenso auf diesen, während die Standardausgabe in die Datei »fehler« umgeleitet wird.

Pipes Zurück Anfang

Pipes (Röhren) dienen der Verknüpfung eines Ausgabe- mit einem Eingabestrom:

user@sonne> cd /dev
user@sonne> ls -l | less

speist die Ausgabe von »ls -l« in die Eingabe von »less« (ohne diese Pipe hätte man keine Chance, die Ausgaben - ca. 1500 Zeilen - am Bildschirm zu verfolgen).

Anstelle von Pipes können auch FIFO-Dateien verwendet werden (kaum gebraucht):

user@sonne> mkfifo fifo
user@sonne> ls -l > fifo&
user@sonne> less -f fifo
user@sonne> rm fifo

»ls -l« schreibt nun in die Datei »fifo«, aus der »less« seine Daten bezieht. Um die Shell für die nächste Eingabe frei zu bekommen, wurde »ls -l« im Hintergrund gestartet (& bewirkt diesen Effekt).

Alternativ kann man auch wie folgt vorgehen:

user@sonne> ls -l > fifo
^z

[1]+  Stopped                 ls --color=tty -l >fifo
user@sonne> bg
[1]+ ls --color=tty -l >fifo &
user@sonne> less < fifo
[1]+  Done                    ls --color=tty -l >fifo

[Ctrl]-[Z] stoppt die Ausführung des aktiven Prozesses (es erscheint eine Meldung: »..Stopped...«), »bg« lässt den Prozess nun im Hintergrund laufen. Mit Beenden von »less« terminiert auch »ls -l«. Mit »fg« kann man den zuletzt in den Hintergrund beförderten Prozess wieder in den Vordergrund holen (»fg %jobnr« holt den Job mit der angegebenen Nummer in den Vordergrund).

Man beachte, dass bei Kommunikationen mittels Fifo-Dateien jeder Datentransfer die Funktionen des Dateisystems bemüht, während die Verwendung von Pipes auf Kernel-interne Puffer zurückgreift, wodurch die Methodik wesentlich schneller arbeitet. Allerdings kann die Pipe nur zwischen Prozessen mit demselben Elternprozess angewandt werden. Fifo-Dateien hingegen ermöglichen den Datenaustausch zwischen beliebigen Prozessen.

Kommandos, dessen Ein- und Ausgaben sich mit einer Pipe verknüpfen lassen, bezeichnet man häufig als Filter.

Korrekturen, Hinweise?
Startseite Nächste Seite Nächstes Kapitel Vorherige Seite Kapitelanfang