Я предполагаю, что вы все еще хотите видеть STDERR и STDOUT на терминале. Вы могли бы пойти за ответом Джоша Келли, но я нахожу в фоновом режиме tail
, который выводит ваш лог-файл очень хакерским и грязным. Обратите внимание, как вам нужно сохранить exra FD и выполнить очистку после этого, убив его, и технически это должно быть сделано в trap '...' EXIT
.
Есть лучший способ сделать это, и вы уже обнаружили это: tee
.
Только вместо того, чтобы использовать его для своего стандартного вывода, используйте тройник для стандартного вывода и один для стандартного вывода. Как ты это сделаешь? Замена процесса и перенаправление файлов:
command > >(tee -a stdout.log) 2> >(tee -a stderr.log >&2)
Давайте разберем это и объясним:
> >(..)
>(...)
(процесс подстановки) создает FIFO и позволяет tee
прослушивать его. Затем он использует >
(перенаправление файлов) для перенаправления STDOUT command
на FIFO, который прослушивает ваш первый tee
.
То же самое для второго:
2> >(tee -a stderr.log >&2)
Мы снова используем подстановку процессов, чтобы создать tee
процесс, который читает из STDIN и выводит его в stderr.log
. tee
выводит свой вход обратно в STDOUT, но так как его ввод - наш STDERR, мы хотим перенаправить STDOUT tee
в наш STDERR снова. Затем мы используем перенаправление файлов для перенаправления STDERR command
на вход FIFO (STDIN tee
).
См. http://mywiki.wooledge.org/BashGuide/InputAndOutput
Замена процесса - это одна из тех приятных вещей, которые вы получаете в качестве бонуса, выбирая bash
в качестве оболочки в отличие от sh
(POSIX или Bourne).
В sh
вам придется делать что-то вручную:
out="${TMPDIR:-/tmp}/out.$$" err="${TMPDIR:-/tmp}/err.$$"
mkfifo "$out" "$err"
trap 'rm "$out" "$err"' EXIT
tee -a stdout.log < "$out" &
tee -a stderr.log < "$err" >&2 &
command >"$out" 2>"$err"