Я хочу записать как stderr и stdout в файл журнала, так и распечатать stderr на терминал (или устройство вывода по умолчанию).
Мотивация: у меня есть команда в моем crontab, и я хочу записать весь ее вывод в файл, и я хочу, чтобы cron отправил мне электронное письмо, если что-то будет записано в вывод ошибки.
У меня был некоторый успех с этим:
(echo out1; echo err1 1>&2; echo out2; echo err2 1>&2) \
2> >(tee -a log) \
1>>log
Или же:
(echo err1 1>&2; echo out2; echo err2 1>&2) \
3>&1 \
1> >(tee -a log 1>/dev/null) \
2> >(tee -a log 1>&3)
Или с exec:
exec 3>&1
exec 1> >(tee -a log2 1>/dev/null)
exec 2> >(tee -a log2 1>&3)
echo out1; echo err1 1>&2; echo out2; echo err2 1>&2
(Третье решение также регистрирует приглашение, поэтому оно не работает в интерактивной оболочке.)
Проблема всех трех решений состоит в том, что файл журнала содержит строки в другом порядке:
out1
out2
err1
err2
Вместо этого:
out1
err1
out2
err2
Есть ли способ предотвратить это? Нечто подобное 2>&1
, которое дублирует сам вывод, а не дескриптор.
Есть очень похожий вопрос для Windows