Я думаю, вы хотите максимально упростить и оптимизировать это. Сейчас я не могу придумать лучшего решения, чем шаг за шагом. А именно,
$ 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
Ну, вы можете использовать сопроцесс, чтобы вам не приходилось много раз звонить, если это важно для вас.
$ coproc tee -a log [1] 26417 $ echo out1 >> log $ echo err1 >&"$" $ echo out2 >> log $ echo err2 >&"$" $ cat log out1 err1 out2 err2
Теперь, какие бы ошибки не были, они ждут в выходном канале сопроцесса. Если вам просто нужно проверить, есть ли что-то там, это будет делать:
$ timeout 1 head -n1 <&"$" >/dev/null && echo yes # or something else yes
Если вы хотите повторно использовать ошибки, вы можете изменить сопроцесс в соответствии с вашими целями.
Вы также можете установить перенаправление для скриптов и двоичных файлов. Конечно, до тех пор, пока они сами не имеют жестко перенаправленных перенаправлений. Таким образом, вы можете сделать это,
$ some_executable 2>&"$" >>log
И логика остается прежней.