===== Standard I/O und Redirection (Umleitung) ===== Internal reference: topics/04-1.md \\ ==== Standard-In, -Out und -Error ==== Wenn sie mit der Shell arbeiten, gibt es unterschiedliche Informationskanäle, welche sie verwenden können. * ''stdin'' - Standardeingabekanal (0): z.B. sie geben Zeichen über die Tastatur ein * ''stdout'' - Standardausgabekanal (1): z.B. ein Programm zeigt den Inhalt eines Verzeichnisses am Bildschirm an * ''sterr'' - Standardfehlerausgabekanal (2): z.B. ein Programm erzeugt einen Fehler und zeigt diesen am Bildschirm an Jeder der Kanäle kann über die jeweilige Nummer angesprochen werden (0,1,2) {{:de:modul:m122_aws:topics:inouterr.png?600|Abb-01: Standard-In, -Out und -Error}} \\ ==== Ausgabe umleiten ==== Die Ausgabe (stdout) eines Befehls kann umgeleitet werden mit ''>'' oder ''>>'' Beispiele: ls -la > liste.txt ./meinskript > outputofscript.txt cat outputofscript.txt >> list.txt ''>>'' hängt Inhalt an bestehende Datei an, ''>'' überschreibt den Inhalt komplett mit Neuem {{:de:modul:m122_aws:topics:ausuml.png?600|Abb-02: Ausgabe umleiten (überschreiben oder anhängen}} Die unterschiedlichen Kanäle können mit der Nummer spezifiziert werden: # Leitet nur Fehlermeldungen in die Datei errorsofscript.txt ./meinskript 2> errorsofscript.txt'' # Leitet den üblichen Output in die Datei ''outputofscript.txt'' ./meinskript 1> outputofscript.txt # Dasselbe geht auch im Anhänge-Modus ./meinzweitesskript 2>> errorsofscript.txt # Unterschiedliche Umleitungen der Kanäle in einem Befehl ./skript 1> output.txt 2> error.txt'' Es gibt einen Abfall Eimer: ''> /dev/null''. Darin verschwinden alle Ausgaben. \\ ==== Ausgabekanäle zusammenlegen / Ausgaben unterdrücken ==== Will man Standardausgabe und Standardfehlerausgabe über denselben Kanal ausgeben, kann man diese mit ''2>&1'' (Leitet ''stderr'' in ''stdout'') koppeln: {{:de:modul:m122_aws:topics:uml2.png?600|Abb-03: Nummern der Ausgabe-Kanäle}} ./skript > output.txt 2>&1 Hier ist die Reihenfolge von ''> output.txt'' und '' 2>&1'' wichtig. Umgekehrt funktioniert es nicht wie erwünscht. Will man einen Ausgabekanal *ausschalten*, kann dieser nach ''/dev/null'' (der Linux-Daten-Schredder) umgeleitet werden: # Unterdrückt die Ausgabe von Fehlern ./skript > output.txt 2>/dev/null \\ ==== Eingabe umleiten ==== Gleichwohl kann die Standardeingabe (oder Ein - und Ausgabe gleichzeitig) umgeleitet werden cat < meinFile.txt cat < meinFile.txt > meinKopiertesFile.txt Manuelle Eingabe: ''<<'' fängt eine interaktive Eingabe ab, bis ein Schlüsselwort zu Terminierung eingegeben wird (z.B. ''fertig''). {{:de:modul:m122_aws:topics:einuml.png?400|Abb-04: Eingabe umleiten}} sort << fertig Z B A fertig A B Z Praktischer Anwendungsfall: Um interaktive Tools (wie ftp oder ssh) mit programmierten Eingaben zu füttern! \\ ==== Pipeline ==== Das Konzept der Pipeline ist sehr effektiv beim Shell-Scripting! (Hint: Im Gegensatz zu Nordstream sollte es oft eingesetzt werden!) {{:de:modul:m122_aws:topics:pipeline.png?600|Abb-05: Pipeline}} In einer Pipeline wird die Ausgabe (stdout) des vorhergehenden Befehls als textueller Output an den nächsten weitergereicht: \\ (1) Filtert alle Zeilen mit dem Begriff ''hallo'' aus der Datei ''meinFile.txt'': cat meinFile.txt | grep hallo \\ (2) Filtert und sortiert alle Zeilen mit dem Begriff ''hallo'' aus der Datei ''meinFile.txt'' (ohne Duplikate): cat meinFile.txt | grep hallo | uniq | sort \\ (3) liefert eine Liste aller Benutzernamen (Alles vor dem ersten Doppelpunkt in jeder Zeile in ''/etc/passwd''), ausser dem Benutzer irc. cat /etc/passwd | grep -v irc | cut -d ’:’ -f 1 ---- [[https://creativecommons.org/licenses/by-nc-sa/4.0/|{{https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png}}]] Daniel Garavaldi