Dieser Artikel ist größtenteils für alle Ubuntu-Versionen gültig.
Beim Arbeiten im Terminal bietet die Bash verschiedene Möglichkeiten, die Ausgabe der einzelnen Befehle umzuleiten bzw. an andere Befehle weiterzuleiten. Ebenso besteht die Möglichkeit, dass Befehle, die standardmäßig von der Standardeingabe lesen, alternativ die Eingabe(n) aus einer Datei lesen.
Vorab noch ein wenig Hintergrundwissen: Alle Befehle und Programme, welche in der Bash gestartet werden, erhalten drei Kanäle zugewiesen:
Den Standardeingabekanal stdin, dieser hat die Nummer 0 (null). Normalerweise liest stdin Eingaben von der Tastatur, welche mit dem Terminal verbunden ist.
Den Standardausgabekanal stdout, dieser hat die Nummer 1 (eins). Normalerweise schreibt stdout Ausgaben auf den Bildschirm, welcher mit dem Terminal verbunden ist.
Den Standardfehlerkanal stderr, dieser hat die Nummer 2 (zwei). Normalerweise schreibt stderr Ausgaben auf den Bildschirm, welcher mit dem Terminal verbunden ist.
Mit Hilfe des "Größer als" Zeichens > lässt sich die Standardausgabe stdout umleiten. Eine typische (und sehr häufige) Anwendung ist das Umleiten in eine Datei. So schreibt zum Beispiel der Befehl
ls /home/user > verzeichnis.txt
das ausgegebene Verzeichnis /home/user in die Datei verzeichnis.txt anstatt in das Terminal.
Existiert die Datei verzeichnis.txt nicht, so wird diese angelegt. Existiert die Datei bereits, so wird diese ohne Rückfrage überschrieben!
Aus demselben Grund funktioniert beispielsweise auch sed s/muster/ersetzungstext/ < datei.txt > datei.txt nicht. Da die Öffnung des umgeleiteten Ausgabekanals - die damit einhergehende Löschung des Inhalts von datei.txt - der Öffnung des Eingabekanals vorausgeht, arbeitet sed mit einer leeren Datei.
Es ist aber auch möglich, die Ausgabe an existierende Dateien anzuhängen, in dem man statt ein > zwei >> verwendet. Der Befehl
ls /home/user/Desktop >> verzeichnis.txt
hängt den Inhalt von /home/user/Desktop also an die Datei verzeichnis.txt an.
Neben stdout schreibt auch der Standardfehlerkanal stderr auf die Standardausgabe. Möchte man die Ausgabe von stderr umleiten, so nutzt man den Befehl
ls -la /home/user 2> fehler.txt
2> heißt soviel wie "leite den Kanal 2 (stderr) um".
Der Kanal 1 stdout muss bei der Umleitung nicht explizit benannt werden. ">" wird von der Bash automatisch mit "1>" gleichgesetzt.
Es lassen sich auch beide Kanäle gleichzeitig in zwei verschiedene Dateien umleiten:
ls -la > verzeichnis.txt 2> fehler.txt
So wird die Ausgabe von ls in die Datei verzeichnis.txt umgeleitet, Fehlermeldungen in die Datei fehler.txt. Weiterhin ist es auch möglich, beide Kanäle in eine Datei zu leiten:
ls -la > gemeinsam.txt 2>&1
"2>&1" bedeutet also soviel wie "schreibt die Ausgabe von Kanal 2 (stderr) in die gleiche Datei wie die von Kanal 1 (stdout)".
Mit "2>>" kann man auch den Kanal 2 an eine Datei anhängen. So lassen sich z.B. Fehlermeldungen während einer Datensicherung von Tar an eine Logdatei anhängen:
echo "Sicherung" >> backup.log tar -cf sicherung.tgz "/home" 2>> backup.log
Mit Hilfe des "Kleiner als" Zeichens < lässt sich die Standardeingabe stdin umleiten. Die allgemeine Syntax lautet:
Befehl < Datei
Dieser Aufruf bewirkt, dass der Befehl die benötigten Eingaben aus Datei liest anstatt aus dem Terminal. Die Umleitung von stdin kommt eher selten vor.
Der Pipe-Operator (Pipe = Kurzform für Pipeline) leitet die Ausgabe eines Befehls direkt an einen anderen Befehl weiter (anstatt ins Terminal). Damit kann der zweite Befehl das Ergebnis bzw. die Ausgabe des ersten Befehls weiterverarbeiten. Die allgemeine Syntax lautet:
Befehl1 | Befehl2
Eine typische Anwendung für den Pipe-Operator ist z.B. das Ausrufen eines Befehls, der eine größere Menge an Daten auf stdout schreibt (z.B. Pager wie cat, Ausgaben von Systemmeldungen wie z.B. dmesg oder Ausgaben von Prozessinformationen wie ps und pstree) in Kombination mit Datensortierung (z.B. sort) oder Durchsuchen der Ausgabe nach bestimmten Ausdrücken (z.B. grep). Einige Beispiele:
Im ersten Beispiel werden alle laufenden Prozesse durch ps ausgegeben, der Pipe-Operator leitet die Ausgabe am sort weiter. sort sortiert die Daten um (absteigende numerische Sortierung, Option -nr) und gibt die umsortierten Daten dann an stdout weiter.
ps ax | sort -nr
Im zweiten Beispiel gibt cat die komplette Log-Datei Xorg.0.log aus (inklusive Zeilennummerierung, Option -n), der Pipe-Operator leitet diese an grep weiter. grep sucht nur nach Zeilen, in denen der Ausdruck "WW" vorkommt (WW = Warnmeldung des X-Servers). Die Ausgabe von grep erfolgt dann (standardmäßig) auf stdout.
cat -n /var/log/Xorg.0.log | grep WW
Im dritten Beispiel kommen mehrere Pipelines zum Einsatz. Das zweite Beispiel wird durch einen weiteren Pipe-Operator und den Befehl grep AIGLX ergänzt. Somit werden nur noch Zeilen aus der Xorg.0.log angezeigt, welche die Ausdrücke "WW" und "AIGLX" enthalten.
cat -n /var/log/Xorg.0.log | grep WW | grep AIGLX
Natürlich lässt sich der Pipe-Operator auch mit der Umleitung von stdout kombinieren:
cat -n /var/log/Xorg.0.log | grep WW > warnungen_xorg.txt
Unter Tipps und Tricks wird die "Sinnlose Verwendung von cat" angesprochen! Bitte beachten! grep unterstützt die Option -n ebenfalls.
Das Programm tee liest von der Standardeingabe stdin und verdoppelt die eingelesenen Daten. Die Daten werden dann je einmal an eine Datei und an die Standardausgabe stdout weitergeleitet. Die allgemeine Syntax lautet:
tee <Optionen> Ausgabedatei
tee kennt die folgenden Optionen:
| tee - Optionen | |
| Option | Beschreibung |
-a oder --append | Die Daten aus der Standardeingabe stdin werden an die Ausgabedatei angehängt anstatt diese zu überschreiben. |
-i oder --ignore-interrupts | Interrupt-Signale werden ignoriert. |
--help | Zeigt Hilfsinformationen zu tee an. |
--version | Zeigt die Versionsnummer von tee an. |
Üblicherweise wird tee in einer Pipe verwenden, wie z.B.:
ls -la | tee alle_dateien.txt | grep *.txt
Es wird das ausführliche Inhaltsverzeichnis angezeigt, einmal (vollständig) in die Datei alle_dateien.txt geschrieben und einmal an grep weitergeleitet, welches nur alle txt-Dateien auf stdout ausgibt.
Diese Revision wurde am 6. Februar 2010 um 00:09 Uhr
von apollo13 erstellt.
Dieser Seite wurden folgende Begriffe zugeordnet:
Shell
2004 – 2010 ubuntuusers.de • Einige Rechte vorbehalten