Worum gehts?
Manchmal möchte man auch mal die Daten von STDERR verarbeiten. Gerade möchte ich zum Beispiel meine Fehlermeldung die auf STDERR rauskommen mit einem Zeitstempel versehen.
Sämtliche Befehle arbeiten aber nur mit den Daten von STDOUT.
Wie kann man das also machen?
Es wird einfach zeitweise STDERR und STDOUT vertauscht. Nach der Verarbeitung werden die Kanäle wieder zurück getauscht.
Umsetzung
Einfacherweise verwende ich im ersten Schritt jetzt keinen Zeitstempel, sondern nur eine einfache Zeilennummerierung.
Wie funktioniert das genau?BEFEHL-1 3>&1 >&2 2>&3 |
nl 3>&1 >&2 2>&3
BEFEHL-1 legt einen neuen Dateideskriptor("3") an der auf dasselbe Ziel wie STDOUT zeigt. Danach wird STDOUT mit dem Wert von dem Ziel des Dateideskriptors STDERR überschrieben. Anschliessend wird STDERR mit dem Wert von Dateideskriptor 3 überschrieben. Die Werte sind also jetzt vertauscht. Anschliessend werden STDOUT und STDERR durch die Pipe an den nächsten Befehl übergeben und dieser bearbeitet nun gemäß Spezifikation STDOUT. Dateideskriptor 3 wird nicht übergeben. Anschliessend werden die Deskriptoren wieder zurückgetauscht, so das die ursprünglichen STDOUT-Daten auch wieder auf STDOUT geschrieben werden, vielleicht für einen weiteren Befehl.
Zeitstempelbeispiel
...oder mit den Hilfsprogrammen von DJB's Daemontools:BEFEHL-1 3>&1 >&2 2>&3 |
(
while read line
do
echo "$(date): $line"
done
) 3>&1 >&2 2>&3 |
BEFEHL-2
BEFEHL-1 3>&1 >&2 2>&3 |
tai64n | tai64nlocal 3>&1 >&2 2>&3 |
BEFEHL-2
Lesezeichen