Bei der Ausführung von Kommandos unter Bash existieren drei verschiedene „Kanäle“ (Dateideskriptoren, die auf Betriebssystemebene wie Dateien behandelt werden).
Standardeingabe (1 – stdin)
Wenn du ein Script oder einen Befehl absetzt, so werden diese über die Standardeingabe gelesen. Als übliche Standardeingabequelle gilt die Tastatur.
Standardausgabe (2 – stdout)
Dorthin werden alle Ausgaben des Scripts geleitet. Als übliche Standardausgabequelle gilt das Terminal.
Standarderror (3 – stderr)
Über diesen Kanal werden alle Fehler ausgegeben. Als Standarderrorausgabequelle dient dabei ebenfalls das Terminal.
Wozu werden diese Kanäle verwendet?
Ein Beispiel wäre, wenn du den gesamten Inhalt aus einem Verzeichnis in separate Datei schreiben möchtest:
ls *.txt > verzeichnis.txt
Durch diesen Befehle wird die Auflistung des Verzeichnisses direkt in die neu angelegte Datei verzeichnis.txt gespeichert ohne eine Ausgabe auf dem Terminal zu erzeugen.
Wozu ist kann man die Kanäle noch verwenden?
z.B. um die eine Logdatei mit den Fehlern zu befüllen, aber eine korrekte Ausgabe weiterhin auf dem Bildschirm auszugeben.
ls /keinverzeichnis /home/${USER} 2>/tmp/${$}.log # ls - listet Inhalte eines Verzeichnisses auf # /keinverzeichnis - ein nicht vorhandenes Verzeichnis auf dem System # /home/${USER} - euer benutzerspezifisches Homeverzeichnis (außer root) # 2>/tmp/${$}.log - leitet sdtout in die Logdatei mit dem Namen [Prozess-ID].log um
Weiterhin kannst du auch mit Hilfe der Kanäle eine Datei anlegen und befüllen:
$ echo "Das ist der Inhalt" > neueDatei # leitet die Ausgabe in die "neueDatei" $ echo neueDatei $ Das ist der Inhalt
Auf diesem Weg kannst du auch eine Datei z.B. sortieren:
sort < eingabe > ausgabe # für den Sort wird "eingabe" verwendet und die Ausgabe in die der Datei "ausgabe" gespeichert
Es ist nicht möglich, eine Datei zu bearbeiten und gleichzeitig das Ergebnis wieder in diese Datei zu schreiben!
KOMMANDO | FUNKTION |
---|---|
kommando > datei | leitet Standardausgabe zur angegeben Datei |
kommando < datei | liest Eingaben aus der angegeben Datei |
kommando 2> datei | leitet Fehlermeldungen in die angegebene Datei |
kommando >& datei | leitet Ausgaben und Fehler um |
kommando &> datei | leitet ebenfalls Ausgaben und Fehler um |
kommando >> datei | hängt Standardausgaben an die vorhandenen |
kommando &>> datei | hängt Ausgaben und Fehler an die Datei an |
Man kann auch z.B. eine Liste mit Zahlen erstellen:
erstelle_zahlenliste.sh
#!/bin/bash set -x for((i=1;i<=100;i=i+1)) ;do echo ${i} >> ausgabe.dat done
Das Script gibt es hier zum DOWNLOAD