Aus dem Kurs: Bash-Shell-Scripting lernen

Ausgabekanäle

In diesem Video möchte ich Ihnen das Konzept der sogenannten Ausgabekanäle vorstellen mit dem man zwischen normalen Ausgaben und Fehlermeldungen unterscheiden kann. Ich versuche hier jetzt einfach mal ganz dreist mir die Dateien des Systemadministrators root anzeigen zu lassen, mit ls root. Da das vermutlich recht viele Dateien sind lenke ich die Ausgabe in eine Datei um. Nennen wir sie mal Ausgabe.txt. Das hat offensichtlich irgendwie nicht funktioniert. Diese Fehlermeldung gibt die Shell auf dem Bildschirm aus und schreibt sie nicht in meine Datei, Ausgabe.txt, die ganz offensichtlich leer ist. Der Grund dafür ist simpel. Es gibt zwei sogenannte Ausgabekanäle. In den einen von beiden stecken Programme ihre Ausgaben, in den anderen Kanal alle Fehlermeldungen. Diese Trennung hat den Vorteil dass man die Fehlermeldungen ganz gezielt etwa in einer Log-Datei umleiten kann, während die normalen Ausgaben weiterhin auf dem Bildschirm landen. Der Kanal für alle Fehlermeldungen heißt offiziell, Achtung langes Wort, Standardfehlerausgabe, im englischen standard error, oder abgekürzt stderr. Der Kanal für alle normalen Ausgaben heißt Standardausgabe, englisch standardoutput oder abgekürzt stdout. Die normalen Ausgaben eines Programms kann ich mit der spitzen Klammer umleiten, also beispielsweise, sysinfo sh, mach Ausgabe.txt. Dieser Befehl würde also die Ausgaben meine Scripts in die Datei Ausgabe.txt umleiten. Fehlermeldungen wie von ls root geliefert, kann ich analog umleiten wenn ich der spitzen Klammer eine 2 voranstelle, Fehler.txt. In diesem Beispiel landen also alle Fehlermeldungen von ls und wirklich nur die Fehlermeldungen in der Datei Fehler.txt. Und wie Sie sehen, Fehler.txt, ist das auch der Fall. Das ganze funktioniert natürlich auch mit der doppelten spitzen Klammer, also beispielsweise ls root, zwei spitze Klammer, spitze Klammer nach Fehler.txt. In diesem Beispiel würden jetzt alle Fehlermeldungen an die Datei Fehler.txt angehängt. Das beweis' ich Ihnen wieder, Fehler.txt, und wie Sie sehen sind jetzt hier in meiner Fehlerdatei gleich zwei Fehlermeldungen. Häufig möchte man die Fehlermeldungen und die normalen Ausgaben in einer Datei sammeln. Auch das ist möglich. Dazu lasse ich zunächst die Ausgaben, nehmen wir mal die von meinem Script sysinfo, ganz normal in eine Datei umleiten. Nehmen wir auch mal hier wieder Ausgabe.txt. Anschließend weise ich die Shell noch an, die Ausgaben des Fehlerkanals in die Standardausgabe zu schreiben. Dieses kryptische Zeichenmonster, 2 spitze Klammer und 1, sorgt dafür dass die Daten aus dem Fehlerkanal ebenfalls in die Datei Ausgabe.txt fließen. Wenn Sie die normalen Ausgaben und die Fehlermeldungen jeweils in eine eigene Datei schreiben lassen möchten, geben Sie einfach beide Umleitungszeichen nacheinander an. Auf diese Weise könnte ich also die normalen Ausgaben von ls zunächst in die Datei Ausgabe.txt umleiten und zusätzlich alle Fehler in die Datei Fehler.txt. Was hier auf der Kommandozeile klappt funktioniert natürlich auch in einem Script. Mit uptime, 2, spitze Klammer, spitze Klammer, Fehler.txt, würden alle Fehlermeldungen des Programms uptime in die Datei Fehler.txt geschrieben. Echo und auch Printf geben ihre Texte automatisch an der Standardausgabe aus. Wenn mein Script eine Fehlermeldung über den Standardfehlerkanal ausgeben soll, dann muss ich die Ausgaben umleiten und zwar an die spezielle Gerätedatei Def stderr. Damit gibt das Skript jetzt den Text System läuft seit, als Fehlermeldung aus. Allerdings muss es auch auf die Gerätedatei Def stderr zugreifen dürfen. Ein besserer Weg ist deshalb die Ausgaben dieses kompletten Befehls in die Standardfehlerausgabe zu schieben. Dazu muss ich nur ganz am Anfang der Zeile diesen kryptischen Zeichensalat voranstellen. In den vergangenen Minuten habe ich Ihnen gezeigt, wie Sie über spezielle Operatoren die Ausgaben und Fehlermeldungen von Programmen jeweils getrennt umleiten können.

Inhalt