... ok, also zum Thema "Umleitungen":
In dem Strang von 2010, den ich oben verlinkt hatte, hatten wir damals auch schon verschiedene Varianten diskutiert und erläutert. (→ lies es nochmal durch !)
Die übliche Grund-Version ist, die Devices reihum zu vertauschen: 3>&2 2>&1 1>&3
(und ja: die Device-Nummer ist egal, solange man die 0, 1 und 2 in Ruhe lässt)
Die Simpel-Version 2>&1 1>&2
funktioniert nämlich nicht: dabei werden die beiden Datenströme vermischt.
Zum testen und zeigen erzeuge ich hier die Ausgabe einfach mal mit awk
:
track@track:~$ var=$( awk 'BEGIN{ print "out"; print "err" > "/dev/stderr"}' )
err
track@track:~$ echo "$var"
out
dann kann man dabei die beiden Ausgaben entsprechend vertauschen: (womit die Error-Ausgabe in der Variablen landet)
track@track:~$ var=$( awk 'BEGIN{ print "out"; print "err" > "/dev/stderr"}' 3>&2 2>&1 1>&3 )
out
track@track:~$ echo "$var"
err
Ob Du die Devices nun rechs herum oder links herum vertauscht, ist egal. Du musst nur aufpassen, dass das Device zuerst mal existiert, bevor Du es umleiten kannst:
track@track:~$ var=$( awk 'BEGIN{ print "out"; print "err" > "/dev/stderr"}' 2>&1 1>&3 3>&2 )
track@track:~$ echo "$var"
bash: 3: Ungültiger Dateideskriptor
Die Fehlermeldung landet hier sehr wohl in der Variablen ( 2>&1
funktioniert also), aber der Deskriptor, auf den mit 1>&3
umgeleitet werden soll, existiert da noch nicht. Deshalb bricht er vor der letzten Umleitung ab, und auf /dev/stderr kommt nichts an.
Die Version von mir oben ist nun eine Abkürzung: statt 1>&3 kann man >&3 schreiben, und die Umleitung des Filedeskriptors 3 hatte ich nach vorn herausgezogen. Mehr steckt eigentlich nicht dahinter.
Es loht sich, die Links auf Greg's Wiki nachzulesen, da ist das alles noch sehr viel ausführlicher erklärt.
Und ansonsten: probier einfach selber die verschiedenen Varianten durch, so wie ich hier oben.
LG,
track