UnixTools01 10
Redirect Output
Bisher war es so, dass, wenn wir ein Kommando ausführten, dass dieses Kommando siene Antwort auf den Bildschirm schrieb (damit wir, die Nutzer, sie dort lesen können). Das muss aber nicht immer so sein. Unix/Linux-Programme wurden nämlich so programmiert, dass sie ihre Ausgaben nicht ausdrücklich an den Bildschrim schicken, sondern über eine "Ausgangsleitung" in die Umwelt schicken. Diese "Ausgangsleitung", nennen wir Standard Out' oder kurz stdout. Normalerweise ist stdout mit dem Bildschirm verbunden, d.h. wenn das Programm der Umwelt etwas mitzuteilen hat, dann schriebt es das meist auf den Kanal stdout, und weil dieser Kanal in der Regel mit dem Bildschirm verbundenist, sehen wir die Ausgabe auf dem Bildschirm.
ls /bin > file.txt
Es ist jedoch möglich, einem Kommando zu sagen, dass es stdout nicht zum Bildschrim leiten soll, sondern zum Beispiel in eine Datei
$ ls /bin > file.txt
Dieses Kommando beispielsweise listet alle Dateien in dem Verzeichnis /bin auf. Das sind sehr sehr viele Dateien. Statt die Namen aller Dateien auf den Bildschirm zu schrieben (was der Normalfall wäre), sagen wir mit > file.txt am ENde des Kommandos, dass wir stdout in die besagte Datei umlenken. Anschließend können wir uns den Inhalt der datei ansehen, zu, Beispiel mit more
$ more file.txt arch arping awk basename bash cat ...
Das ist sinnvoll, falls wir die in die Datei umgelenkte Ausgabe des Programms später irgendwie bearbeiten wollen. Übrigens: Statt file.txt können Sie die Datei natürlich nennen, wie Sie wollen. Gibt es die Datei schon, wird der alte Inhalt gelöscht und die Datei wird mit dem neuen Inhalt überschrieben. Gibt es die Datei noch nicht, so wird sie neu angelegt.
ls /bin > /dev/null
Manchmal ist der Grund, warum wiur die Ausgabe eines Kommandos (stdout) in eine Datei umlenken wollen, gar nicht, dass wir diese Datei später lesen/verarbeiten wollen. Wir wollen nur einfach nicht, dass die Ausgabe auf dem Bildschirm erscheint. Wir lenken also stdout in eine Datei um, damit die Ausgaben dort verschwinden, wie auf einer Müllhalde. Für genau diesen Zweck wiurde die Datei /dev/null erfunden. Alles was in diese Datei geschrieben wird, wird vom Betriebssystem einfach weggeworfen. Sie wollen also gar nicht wissen, was ls ausgegeben hat? Dann lenken Sie stdout einfahc in die Datei /dev/null um.
$ ls > /dev/null
In diesem Beispiel ist es vielleicht wirklich schwer zu erklären, warum wir ls überhaupt aufrufen, wenn wir uns für die Ausgabe gar nicht interessieren. Aber glauben Sie mir, wir werden bald Programme kennenlernen, die etwas anderes sinnvolles machen, und von denen wir nur wollen, das sie dies machen, aber ohne uns dabei den Bildschrim vollzuschreiben. Dann ist die oben beschriebene Umlenkung von stdout nach /dev/null extrem praktisch.
ls >> file.txt
Lenken wir die Standard Ausgabe (stdout) eines Programms in eine Datei um, so wird diese Datei, falls es sie bereits vorher gab, neu überschrieben. Das heisst alles was zuvor in der Datei stand wird gelöst und ist damit verloren.
Oft wollen wir aber, dass die Ausgabe zusätzlich in die angegebene Datei geschrieben wird, nämlich am Ende der Datei dazugeschrieben (append). Das erreichen wir mit >> dem, wie gewohnt, der Name der Datei folgt, in die hinein die Ausgabe umgelenkt werden soll
$ ls /bin/a* > file.txt
Listet alle Dateien in dem Verzeichnis /bin, die mit einem a beginnen. Die Ausgabe (stdout) wird in die Datei file.txt umgelenkt. Hier bewerkstelligen wir die Umlenkung mit einem einfachen Größer-Zeichen, '>'. Das bedeutet, falls es diese Datei schon gibt, wird als erstes der alte Inhalt gelöscht.
$ ls /bin/b* >> file.txt
Listet alle Dateien in dem Verzeichnis /bin, die mit einem b beginnen. Die Ausgabe (stdout) wird in die Datei file.txt umgelenkt, und zwar wird es an die Datei file.txt angehängt (append). Das bewerkstelligen wir mit einem doppelten Größer-Zeichen, >>
Am Ende enthält die Datei file.txt sowohl die mit a beginnenden Namen (am Anfang) und danach die mit b beginnenden Namen.
Bemerkung: Wir haben hier (nur) darüber gesprochen, den Ausgabekanal atdout eines Programms umzulenken. Wir werden später sehen, dass es neben stdout noch einen weiteren AUsgabekanal gibt, namens Standard Error (stderr), über den Programme hauptsächlich Fehlernachrichten ausgeben. Darüber werden wir später genauer sprechren. Sie sollen nur schon wissen, dass jedes Programm zwei Ausgabekanäle hat, stdout über den der Umwelt die meisten (gewöhnlichen) Ausgaben mitgeteilt werden. Zusätzlich (und unabhängig davon) gibt es den Kanal stderr über den GFehlernachrichten ausgegeben werden. Beide Ausgabekanäle, stdout und stderr, können wir unabhängig voneinander umlenken, wobei wir bisher nur die Umlenkung für stdout gesehen haben. Die Umlenkung von stderr sehen wir später.
Redirect Input
Erwartet ein Programm eine Eingabne von uns, so geben wir diese im Mormalfall über die Tastatur+Bildschrim ein. Wie schon bei den Ausgabekanälen, so ist auch bei der Eingabe das Programm nicht darauf festgelegt, dass diese unbedingt von der Tastatur+Bildschirm kommt, vielmehr verwendet das Programm einen Eingabekanal namens Standard In (stdin). Normalerweise ist stdin mit Tastatur+Bildschrim verbunden, und wir geben unsere Daten dort händisch ein.
Wir knnen der Shell aber auch sagen, dass es stdin stattdessen mit einer Datei verbinden soll. Wann immer das Programm dann eine Eingabe erwartet, erhält es diese sofort aus der Datei. Dabei ist es dem Programm völlig egal, woher die Eingaben wirklich kommen. Das Programm verwendet einfach den EIngabekanal stdin und die Shell hat diesen Kanal (atsin) vorher entweder mit der tastatur oder mit einer Datei verbunden. Das Programm wird keinen Unterscheid bemerken.
$ more < file.txt
Das Programm more erwartet normalerweise ein oder mehrere Dateinamen, um dan den Inhalt dieser Datei nutzerfreundlich (seitenweise) auszugeben. Rufen wir more völlig ohne Dateinamen auf, dann erwartet es seine Eingabe von stdin. Statt diese nun händisch +über Tastatur+Bildschrim einzutippen, können wir stdin auf von einer Datei umlenken, siehe oben.
$ wc < file.txt
Ähnlich verhält es sich mit dem Progra,, wc (word count). Rufen wir es ohne Dateinamen als Argumente auf, so erwartet es seine Eingabe über den stdin Eingabekanal. Wir könnten nun den Text händisch über die Tatsatur eintippen, oder wir llken stdin aus einer Datei um, wie im obigen Beispiel zu sehen.
$ cat < input.txt > output.txt
Hier sehen wir eine Kombination, wo sowohl stdout in eine Datei umgelenkt wird, als auch stdin aus einer Datei umgelenkt wird. Ähnlich more und wc zuvor, hat auch cat die Eigenschaft, seien Eingabedaten von stdin zu lesen, sofort keine Dateinamen in der Argumenten-Liste angegeben wurden, was hier der Fall ist. HIer erhält das Programmm cat also eine Eingabe, Umlenkung von stdin, aus einer Datei. Würden wir es dabei belassen, würde die Ausgabe auf dem Bildschirm erscheinen. Aber im obigen Beispiel haben wir stdout ebenfalls umgelenkt, nämlich in die Datei output.txt, also wird cat seine Ausgabe in diese Datei umlenken. Zusammengefasst bedeutet das, dass cat die Eingabe (durch Umlenkung von stdin) von der Datei input.txt erhält, und die Ausgabe (durch Umlenkung von stdout) in die Datei output.txt schriebt. Man könnte auch einfacher sagen, dass dieses Kommanso, so wie es hier steht, den Inhalt der Datei input.txt in die Datei output.txt kopiert.
Pipes
ls -lisa /bin | more ls -lisa /bin | wc