Запись стандартного вывода в один файл и оба в другой довольно проста с помощью tee
:
{ cmd | tee stdout.log; } &> both.log
Оба дескриптора составной команды перенаправляются на both.log
, но стандартный вывод cmd
сначала передается через tee
в stdout.log
, а затем записывается в both.log
.
Запись стандартной ошибки в одну и обе в другую более сложна.
{ foo 2>&1 1>&3 | tee stderr.log ; } 3>&1 | tee both.log > /dev/null
Это немного сложно описать правильно. Во-первых, стандартная ошибка группы команд игнорируется; это стандартный вывод по трубе на tee both.log
. Но 3>&1
также копирует свой fd 3 в стандартный вывод. Итак, вопрос в том, что записывается в это?
Внутри группы команд стандартный вывод foo
- это канал к tee stderr.log
. 2>&1
копирует tee's
стандартную ошибку в этот дескриптор, а 1>&3
копирует foo's
стандартный вывод в унаследованный fd 3.