Kyles Unix / Linux-Befehl erledigt das Umschalten des STDERR mit dem STDOUT. Die Erklärung ist jedoch nicht ganz richtig. Die Umleitungsoperatoren kopieren oder duplizieren nicht, sondern leiten den Fluss nur in eine andere Richtung um.
Das Umschreiben von Kyles Befehl durch zeitweiliges Verschieben von 3> & 1 zum Ende würde das Verständnis des Konzepts erleichtern:
find /var/log 1>&2 2>&3 3>&1
Auf diese Weise geschrieben, würde Linux einen Fehler anzeigen, da & 3 noch nicht existiert, da es vor 3> & 1 liegt. 3> Etwas ist eine Möglichkeit zu deklarieren (definieren), dass wir ein drittes Rohr verwenden, also muss es lokalisiert werden, bevor wir Wasser in dieses Rohr fließen lassen, zum Beispiel wie Kyle es geschrieben hat. Probieren Sie es einfach zum Spaß anders aus:
((echo "STD1"; anyerror "bbbb"; echo "STD2" ) 3>&1 4>&2 1>&4 2>&3) > newSTDOUT 2> newSTDERR
Es ist eine Schande, keine Möglichkeit zu haben, Kopien anzufertigen. Sie können Dinge wie "3> & 1 3> & 2" nicht im selben Befehl ausführen, da Linux nur den ersten Befehl verwendet, der gefunden wurde, und den zweiten Befehl schließt.
Ich habe (noch) keine Möglichkeit gefunden, sowohl den Fehler als auch die reguläre Ausgabe in eine Datei zu senden und auch eine Kopie des Fehlers mit einem Befehl an die Standardausgabe zu senden. Zum Beispiel habe ich einen Cron-Job, bei dem beide Ausgaben (Fehler und Standard) in eine Protokolldatei gehen sollen und der Fehler auch ausgeht, um eine E-Mail-Nachricht an meinen blackBerry zu senden. Ich kann es mit zwei Befehlen unter Verwendung von "tee" tun, aber der Fehler wird nicht in der richtigen Reihenfolge in der regulären Ausgabezeile in der Datei angezeigt. Dies ist die hässliche Art und Weise, wie ich das Problem gelöst habe:
((echo "STD1"; sdfr "bbbb"; echo "STD2" ) 3>&1 1>&2 2>&3 | tee -a log1 ) 2>> log1
Beachten Sie, dass ich log1 zweimal verwenden muss und in beiden Fällen das erste mit der Option "-a" für den Befehl "tee" und das zweite mit ">>" anhängen muss.
Wenn Sie eine Katze log1 machen, erhalten Sie Folgendes:
STD1
STD2
-bash: sdfr: command not found
Beachten Sie, dass der Fehler in der zweiten Zeile nicht wie gewünscht angezeigt wird.