Copyright © 1995 by O'Reilly/International Thomson Verlag

Bitte denken Sie daran: Sie dürfen zwar die Online-Version ausdrucken, aber diesen Druck nicht fotokopieren oder verkaufen.

Wünschen Sie mehr Informationen zu der gedruckten Version des Buches "Linux - Wegweiser zur Installation & Konfiguration", dann klicken Sie hier.


Kapitel 3

Das Speichern von Daten

Systemverwalter (und auch andere Menschen) sehen eine ganze Reihe von wichtigen Systemmeldungen über den Bildschirm huschen. Oft ist es wichtig, daß man diese Nachrichten aufbewahrt, um sie später in Ruhe auswerten zu können oder auch (gar zu oft), damit man sie an jemanden schicken kann, der mit ihrer Hilfe herausfindet, was schiefgelaufen ist. In diesem Abschnitt wollen wir Ihnen deshalb etwas zum Thema Umleitung (redirection) erzählen; das ist eine weitere äußerst nützliche Eigenschaft von UNIX-Shells. Falls Sie aus der DOS-Welt kommen, haben Sie wahrscheinlich bereits eine ähnliche, wenn auch eingeschränkte Art der Umleitung kennengelernt.

Wenn Sie ein Größer-als-Zeichen (>) und einen Dateinamen hinter einem beliebigen Befehl angeben, bewirken Sie damit, daß die Ausgaben des Befehls in diese Datei geschrieben werden. Wenn Sie z.B. die Ausgabe von ls abspeichern wollen, geben Sie ein:

$ ls /usr/bin > ~/Binaries

Die Liste der Dateien in /usr/bin wird damit in einer Datei namens Binaries in Ihrem Home-Verzeichnis abgelegt. Falls es dort schon eine Datei Binaries gibt, wird das > die alte Datei löschen und die Ausgabe des Befehls ls unter diesem Namen speichern. Das Überschreiben einer Datei passiert recht häufig. Wenn Sie mit einer der Shells csh oder tcsh arbeiten, können Sie sich folgendermaßen gegen unbeabsichtigtes Überschreiben schützen:

$ set noclobber

In der bash erzielen Sie denselben Effekt mit:

$ noclobber=1   Es muß keine 1 sein, ein beliebiges Zeichen reicht.

Eine andere (und vielleicht nützlichere) Methode, das Überschreiben zu verhindern, ist das Anhängen der neuen Ausgabe an eine bestehende Datei. Nehmen wir an, daß Sie eine Auflistung von /usr/bin bereits gespeichert haben und daß Sie jetzt den Inhalt von /bin hinzufügen möchten. Mit zwei Größer-als-Zeichen können Sie die neue Auflistung an die bestehende Datei Binaries anhängen:

$ ls /bin >> ~/Binaries

Die Umleitung von Befehlsausgaben ist sehr nützlich, wenn Sie ein Utility wiederholt starten und die Ausgaben zwecks Fehlersuche abspeichern.

Die meisten UNIX-Programme erzeugen tatsächlich zwei Ausgaben (output streams); die eine bezeichnet man als Standardausgabe (standard output), die andere als Standardfehlerausgabe (standard error). Die C-Programmierer unter den Lesern werden dies wiedererkennen: Die Standardfehlerausgabe ist die Datei stderr , in die Sie Systemmeldungen schreiben lassen.

Das >-Zeichen lenkt nicht die Standardfehlerausgabe um -- Sie benutzen es, um die regulären Ausgaben zu speichern, ohne die Datei mit Fehlermeldungen zu überladen. Was aber passiert, wenn Sie gerade die Fehlermeldungen aufheben wollen? Während der Fehlersuche kommt das häufig vor.

Die Lösung ist ein Größer-als-Zeichen, gefolgt von einem Kaufmanns-Und (&). (Diese Konstruktion funktioniert in allen Shells außer der originalen Bourne-Shell.) Damit lenken Sie sowohl die Standardausgabe als auch die Standardfehlerausgabe um. Ein Beispiel:

$ gcc invinitjig.c >& error-msg

Dieser Befehl speichert alle Nachrichten des Compilers gcc in der Datei error-msg . (Selbstverständlich wird der Objektcode nicht dort abgelegt, sondern, wie immer, in invinitjig.o .) In der Bourne-Shell und in bash können Sie das gleiche so formulieren:

$ gcc invinitjig.c &> error-msg

Lassen Sie uns jetzt alle Register ziehen: Wir nehmen an, daß Sie die Fehlermeldungen, aber nicht die normalen Ausgaben abspeichern wollen -- also die Standardfehlerausgabe ohne die Standardausgabe. In der Bourne-Shell und dazu kompatiblen Shells erledigen Sie das mit:

$ gcc invinitjig.c 2> error-msg

Die Shell ordnet selbständig die 1 der Standardausgabe und die 2 der Standardfehlerausgabe zu. Deshalb speichern Sie mit diesem Befehl nur die Fehlermeldungen.

Zum Schluß wollen wir annehmen, daß Sie die Standardausgabe nicht brauchen -- Sie wollen Ihren Bildschirm sauber halten. Die Lösung ist eine Umleitung in eine spezielle Datei namens /dev/null . (Vielleicht haben Sie schon einmal jemanden sagen hören: »Richten Sie ihre Kritik an /dev/null«. Jetzt wissen Sie also, woher dieser Spruch kommt.) Das Verzeichnis /dev ist der Platz, an dem UNIX-Systeme besondere Dateien ablegen, die den Zugriff auf Terminals, Bandlaufwerke und andere Geräte regeln. Die Datei /dev/null ist allerdings einzigartig; alles, was Sie dorthin schicken, verschwindet in einem schwarzen Loch. Der folgende Befehl z.B. speichert die Standardfehlerausgabe und läßt die Standardausgabe verschwinden:

$ gcc invinitjig.c 2>error-msg >/dev/null

Damit sollten Sie in der Lage sein, genau die Ausgaben zu erzeugen, die Sie sehen möchten.

Falls Sie sich schon gefragt haben, ob auch < in der Shell eine Bedeutung hat -- die Antwort lautet: ja. Damit erreichen Sie, daß Befehle ihre Eingaben aus einer Datei lesen. Da die meisten Befehle sowieso die Möglichkeit bieten, auf der Befehlszeile Eingabedateien zu definieren, wird diese »Eingabeumleitung« selten genutzt.

Manchmal möchte man erreichen, daß ein Hilfsprogramm die Ausgaben eines anderen Programms benutzt. Ein Beispiel: Mit dem Befehl sort können Sie die Ausgaben eines anderen Befehls in eine sinnvolle Reihenfolge bringen. Es wäre ziemlich umständlich, wenn Sie die Ausgaben eines Befehls zunächst in eine Datei umlenken und anschließend diese Datei mit sort bearbeiten würden, etwa so:

$ du > du_output 
$ sort -n du_output

UNIX bietet allerdings eine viel schnellere und effizientere Methode, dies zu bewerkstelligen, nämlich die Pipe . Geben Sie zwischen den beiden Befehlen einfach einen senkrechten Strich ein:

$  du | sort -n

Die Shell schickt alle Ausgaben des Programms du weiter an das Programm sort .

In diesem Beispiel steht du für »disk usage« (Plattenbelegung) und gibt an, wie viele Blöcke jede einzelne Datei im aktuellen Verzeichnis belegt. In der Regel erfolgt die Ausgabe in eher zufälliger Reihenfolge:

$ du 
10        ./zoneinfo/Australia
13        ./zoneinfo/US
9         ./zoneinfo/Canada
4         ./zoneinfo/Mexico
5         ./zoneinfo/Brazil
3         ./zoneinfo/Chile
20        ./zoneinfo/SystemV
118       ./zoneinfo
298       ./ghostscript/doc
183       ./ghostscript/examples
3289      ./ghostscript/fonts
        .
        .
        .

Wir haben deshalb beschlossen, die Ausgabe durch sort mit den Optionen -n und -r bearbeiten zu lassen. Dabei sorgt -n dafür, daß »numerisch sortiert« wird statt der üblichen ASCII-Sortierung; -r bewirkt, daß die die »Sortierfolge umgekehrt« wird, so daß die größten Zahlen zuerst erscheinen. Die Ausgabe läßt schnell erkennen, welche Dateien und Verzeichnisse den meisten Speicherplatz beanspruchen:

$  du | sort -rn 
34368     .
16005     ./emacs
16003     ./emacs/19.25
13326     ./emacs/19.25/lisp
4039      ./ghostscript
3289      ./ghostscript/fonts
        .
        .
        .

Weil so viele Dateien vorhanden sind, sollten wir noch eine zweite Pipe einsetzen, um die Ausgabe durch den Befehl more zu leiten (eine der häufigsten Anwendungen für Pipes):

$  du | sort -rn | more 
34368     .
16005     ./emacs
16003     ./emacs/19.25
13326     ./emacs/19.25/lisp
4039      ./ghostscript
3289      ./ghostscript/fonts
        .
        .
        .


Inhaltsverzeichnis Vorherige Abschnitt Nächste Abschnitt