Ich denke, Sie möchten dies so weit wie möglich vereinfachen und optimieren. Ich kann mir jetzt keine bessere Lösung vorstellen als Schritt für Schritt. Nämlich,
$ echo out1 >> log $ echo err1 | tee -a log >&2 err1 $ echo out2 >> log $ echo err2 | tee -a log >&2 err2 $ cat log out1 err1 out2 err2
Nun, Sie könnten einen Coprocess verwenden, so dass Sie nicht mehrmals Tee anrufen müssen, wenn es Ihnen wichtig ist.
$ coproc tee -a log [1] 26417 $ echo out1 >> log $ echo err1 >&"$" $ echo out2 >> log $ echo err2 >&"$" $ cat log out1 err1 out2 err2
Was auch immer die Fehler waren, sie warten in der Ausgabe-Pipeline des Coprocess. Wenn Sie nur prüfen müssen, ob etwas vorhanden ist, müssen Sie Folgendes tun:
$ timeout 1 head -n1 <&"$" >/dev/null && echo yes # or something else yes
Wenn Sie die Fehler wiederverwenden möchten, können Sie den Coprozess an Ihr Ziel anpassen.
Sie können die Umleitung auch für Skripts und Binärdateien festlegen. Solange sie selbst keine festverdrahteten Weiterleitungen haben. So können Sie das tun,
$ some_executable 2>&"$" >>log
Und die Logik bleibt gleich.