Как перенаправить stderr и stout в несколько мест? - PullRequest
3 голосов
/ 25 июля 2011

Мне нужно выполнить команду в bash-скрипте (на freebsd6), и мне нужно, чтобы stderr и stdout команды были отправлены на консоль, в файл журнала И в переменную bash.

Итак, без какого-либо перенаправления я хочу получить следующее:

result=`./command | tee output.log`

Если я запускаю это как есть, только stderr делает это на консоль, и только stdout делает это на оба файла output.logи переменная $ result.Я понимаю, почему это так, но во многих попытках разных перенаправлений не удалось отправить оба потока во все три местоположения.

Как отправить и stderr, и stdout во все три местоположения?

1 Ответ

5 голосов
/ 25 июля 2011
result=`./command 2>&1 | tee output.log | tee /dev/tty`

[править]

Как отметил Н.М. в комментарии, tee принимает несколько аргументов:

result=`./command 2>&1 | tee output.log /dev/tty`

[второе редактирование]

ЗаимствованиеИдея Криса в комментариях, вы также можете сделать это, чтобы отправить вывод в stderr:

result=`./command 2>&1 | tee /tmp/foo.log >(cat 1>&2)`

Чтобы сделать именно то, что вы хотите, лучшее, что я нашел, это:

exec 3>&1 ; result=`./command 2>&1 | tee /tmp/foo.log >(cat 1>&3)` ; exec 1>&3

(Вся проблема в том, что обратные перенаправления stdout перед выполнением чего-либо внутри. Таким образом, эта строка сохраняет и восстанавливает старый stdout в качестве дескриптора 3, что может быть или не быть хорошей идеей ...)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...