Для этого нужно сначала переключения на стандартный вывод и стандартный поток ошибок, который требует дополнительного дескриптора файла:
sh script.sh 3>&2 2>&1 1>&3 3>&-
Последний оператор закрывает вспомогательный дескриптор файла.
После этого вы можете использовать tee
дублировать поток ошибок (который в настоящее время на стандартный ввод) и добавить его в журнал ошибок:
sh script.sh 3>&2 2>&1 1>&3 3>&- | tee -a error.log
И после этого вы можете направить как стандартный ввод и стандартный поток ошибок в вашей комбинированный журнал:
(sh script.sh 3>&2 2>&1 1>&3 3>&- | tee -a error.log) >> both.log 2>&1
Скобки вокруг команды важны для захвата потока ошибок всей команды. Без них будет снят только (пустой) поток ошибок команды tee
, а остальные по-прежнему будут поступать на терминал.
Примечание: это не проверяет, что файловый дескриптор 3 использовался (открыт) раньше. В Баше вы можете использовать это, чтобы выбрать ранее неиспользуемый дескриптор файла и закрыть его на последнее перенаправлении:
sh script.sh {tmpfd}>&2 2>&1 1>&${tmpfd}-
Возможного дубликат [Как перенаправить потоки вывод в различные файлы в той же строке Баша] (HTTP : //stackoverflow.com/questions/7901517/how-to-redirect-stderr-and-stdout-to-different-files-in-the-same-line-of-bash) –