Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen RevisionVorhergehende ÜberarbeitungNächste Überarbeitung | Vorhergehende Überarbeitung | ||
shell:in-out [2008/04/22 15:43] – gerald | shell:in-out [2024/02/29 13:36] (aktuell) – Externe Bearbeitung 127.0.0.1 | ||
---|---|---|---|
Zeile 22: | Zeile 22: | ||
[[http:// | [[http:// | ||
+ | |||
+ | |||
+ | |||
+ | ====== Ein-und Ausgabeumleitung ====== | ||
+ | |||
+ | Die drei dem Terminal zugeordeneten Dateikanäle stdin, stdout und stderr können jederzeit auf Dateien umgeleitet werden. Den drei Standarddateien sind die Filehandles 0 (stdin), 1 (stdout) und 2 (stderr) zugeordnet. | ||
+ | |||
+ | ===== Eingabeumleitung ===== | ||
+ | |||
+ | Das Programm liest nun nicht mehr von der Tastatur (stdin), sondern aus einer Datei, bis das Dateiende erreicht ist. | ||
+ | |||
+ | Die Eingabeumleitung erfolgt durch das Zeichen "<", | ||
+ | |||
+ | Kommando < Dateiname | ||
+ | |||
+ | Statt z. B. beim write-Kommando den Text direkt einzugeben, kann auch einen Datei an ein anderes Terminal gesendet werden: | ||
+ | |||
+ | write markus < Nachricht | ||
+ | |||
+ | ===== Ausgabeumleitung ===== | ||
+ | Die Ausgabe des Programms wird nicht auf dem Bildschirm (stdout) ausgegeben, sondern in einen Datei geschrieben. Die Ausgabeumleitung erfolgt durch das Zeichen ">", | ||
+ | |||
+ | Falls die Datei noch nicht vorhaden war, wird sie automatisch angelegt. Falls die Datei schon vorhanden ist, wird sie überschrieben, | ||
+ | |||
+ | Kommando > Dateiname | ||
+ | |||
+ | | ||
+ | |||
+ | ls -l > info | ||
+ | |||
+ | Umlenkung der Fehlerausgabe (stderr) | ||
+ | Die Umleitung der Fehlerausgabe erfolgt genauso, wie die Ausgabeumleitung, | ||
+ | |||
+ | Kommando 2> Fehlerdatei | ||
+ | |||
+ | (Die Umleitung der Standardausgabe ist nur die Kurzform von Kommando 1> Dateiname). Natürlich ist eine beliebige Kombination von Ein- und Ausgabeumleitung möglich, z. B. | ||
+ | |||
+ | Kommando < Eingabedatei > Ausgabedatei 2> Fehlerdatei | ||
+ | |||
+ | Anhängen von Infos an eine Datei | ||
+ | Es ist auch möglich, die Ausgabe des Programms an eine bereits vorhandene Datei anzuhängen. Dazu wird des ">" | ||
+ | |||
+ | Kommando >> Sammeldatei | ||
+ | |||
+ | Dazu ein paar Beispiele: | ||
+ | |||
+ | | ||
+ | |||
+ | ls -l > liste | ||
+ | who >> liste | ||
+ | |||
+ | Dur Umleitung von Ein- und Ausgabe läßt sich auch unterdrücken. | ||
+ | Für die Ausgabe schreibt man | ||
+ | |||
+ | Kommando > / | ||
+ | |||
+ | oder für die Fehlerausgabe | ||
+ | |||
+ | Kommando 2> / | ||
+ | |||
+ | | ||
+ | |||
+ | Kommando > Ergebnisdatei 2> / | ||
+ | |||
+ | Will man ein Programm mit einem beliebigen Eingabedatenstrom versorgen, schreibt man | ||
+ | |||
+ | Kommando < / | ||
+ | |||
+ | Die Umleitung von stout und stderr in dieselbe Datei würde prinzipiell eine zweimalige Angabe der Datei (eventuell mit einem langen Pfad) erfordern. Für die Standarddateien werden in solchen Fällen spezielle Platzhalter verwendet: | ||
+ | |||
+ | & | ||
+ | |||
+ | & | ||
+ | |||
+ | & | ||
+ | |||
+ | Kommando > ausgabe 2>& | ||
+ | |||
+ | Wenig bekannt ist der Bourne-Shell-Operator <> | ||
+ | Er öffnet eine Datei zum Lesen und Schreiben und verbindet sie mit der Standardeingabe. | ||
+ | Fehlende Dateien legt er automatisch an, im Gegensatz zu > löscht er jedoch nicht den Inhalt bestehender Dateien. Gut eignet sich <> vor allem für den Zugriff auf Geräte, die eine bidirektionale Verbindung voraussetzen - etwa Terminals oder Modems. | ||
+ | |||
+ | Die Bourne-Shell kann noch mehr: Man kann einen beliebigen Kommunikationskanal umlenken, indem er dessen Kennzahl direkt vor das Größer oder Kleiner-Zeichen schreibt. Wie schon erwähnt, steht ' | ||
+ | |||
+ | | ||
+ | |||
+ | Mit den Bourne-Shell-Operatoren <& und >& lassen sich Ein- und Ausgabekanäle miteinander verbinden. | ||
+ | Vor dem Operator darf die Nummer des umgeleiteten Kanals stehen, dahinter muß die des Quell- beziehungsweise Zielkanals folgen. | ||
+ | Die häufigste Konstruktion >datei 2>&1 leitet Standard- und Fehlerausgabe in dieselbe Datei um. | ||
+ | |||
+ | Michael Riepe beschreibt in iX 10/2002, im Artikel "Kreuz und quer - Ein- und Ausgabeumleitung in der Shell", | ||
+ | |||
+ | | ||
+ | |||
+ | cat <a <b >c >d | ||
+ | |||
+ | | ||
+ | |||
+ | | ||
+ | In der Bourne-Shell lassen sich weitere Kanäle mit den normalen Umleitungsoperatoren öffnen; der Benutzer muß lediglich die Nummer des gewünschten Kanals angeben. Mit den Umleitungsoperatoren <& und >& kann er die neuen Kanäle für einzelne Befehle öffnen, zum Beispiel: | ||
+ | < | ||
+ | # Dateimischer | ||
+ | while read X <&3 && read Y <&4 && read Z <&5 | ||
+ | do | ||
+ | echo $X $Y $Z | ||
+ | done 3< | ||
+ | </ | ||
+ | Die Anzahl der offenen Kanäle ist durch die Shell oder das Betriebssystem begrenzt. Portable Skripte dürfen nur die Kanäle 0 bis 9 verwenden. Bourne-Shell-Benutzer verwenden eine Spezialform des Befehls exec: Stehen hinter dem Befehlswort nur Umleitungen, | ||
+ | |||
+ | exec 2>/ | ||
+ | |||
+ | Soll eine Umleitung später aufgehoben werden, kann man den ursprünglichen Kanal duplizieren: | ||
+ | |||
+ | exec 3<&0 <datei | ||
+ | |||
+ | | ||
+ | |||
+ | exec <&3 | ||
+ | |||
+ | | ||
+ |