UnixTools01 10

From
Revision as of 13:28, 28 November 2024 by Jpr (talk | contribs) (Regirect Input)
Jump to navigation Jump to search

redirecting output of a programm to a file

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.

   ls /bin/b* >> file.txt

Redirect Input

let a programm take its input from a file (redirecting input)

   more < file.txt
   wc < file.txt

let the output of programm be used as input of another progra,

   ls -lisa /bin | more
   ls -lisa /bin | wc