Die Bash - Umleitung der Ein- und Ausgabe |
Prozesse |
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
Typische Prozesse starten mit 3 offenen Dateien |
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 |
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 |
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 |
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.