Im Katalog suchen

Linux - Wegweiser zur Installation & Konfiguration, 3. Auflage

Online-Version

Copyright © 2000 by O'Reilly Verlag GmbH & Co.KG

Bitte denken Sie daran: Sie dürfen zwar die Online-Version ausdrucken, aber diesen Druck nicht fotokopieren oder verkaufen. Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.

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


vorheriges Kapitel Inhaltsverzeichnis Stichwortverzeichnis nächstes Kapitel

Das Speichern von Befehlsausgaben

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 um sie an jemanden zu schicken, der mit ihrer Hilfe herausfindet, was schiefgelaufen ist. In diesem Abschnitt wollen wir Ihnen deshalb etwas zum Thema Umleitung (redirection) erzählen, einer weiteren äußerst nützlichen 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 zum Beispiel 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 an diese Datei anhängen 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 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 speichern 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 zum Beispiel 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 das Kleiner-Zeichen (<) 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 obigem 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 »Sortierreihenfolge 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/20.4 13326 ./emacs/20.4/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/20.4 13326 ./emacs/20.4/lisp 4039 ./ghostscript 3289 ./ghostscript/fonts . . .


vorheriges Kapitel Inhaltsverzeichnis Stichwortverzeichnis nächstes Kapitel


Weitere Informationen zum Linux - Wegweiser zur Installation & Konfiguration

Weitere Online-Bücher & Probekapitel finden Sie in unserem Online Book Center


O'Reilly Home | O'Reilly-Partnerbuchhandlungen | Bestellinformationen | Kontaktieren Sie uns
International | Über O'Reilly | Tochterfirmen

© 2000, O'Reilly Verlag