Используя bash, как мне скопировать stderr и stdout в файл журнала, а также оставить их отображенными на консоли?
Я хотел бы сделать это в самом скрипте, используя exec.
Я пробовал с
exec &>> log.out
echo "This is stdout"
echo "This is stderr" >&2
Но вышесказанное ничего не печатает на консоли. Как я могу добиться этого в Bash?
Ответы:
Вы ищете
tee
.Смотрите
man tee
подробности.Чтобы объединить это
exec
, вы должны использовать процесс подстановки . (Подробнееman bash
см.)источник
exec 2>&1 | tee -a log.out
только распечатки на консоли, ничего в лог-файле. Может быть, я не использую правильный синтаксис?tee
в сочетании с процессом замены .the-script | wc -l
например, сделает это, он также посчитает строки ошибок, и вы не увидите ошибок.Ты можешь сделать:
Вы также можете написать это как:
Но поскольку bash не ожидает запуска этих процессов
>(...
), это имеет неприятный эффект: иногда выводить что-то на терминал после возврата команды, что может иметь еще более неприятные последствия (например, молча отбрасывать этот вывод), если атрибут терминала «tostop» включенВ любом случае, создавая
stdout
канал в обоих решениях и поскольку две команды независимо выводят выходные данные и сообщения об ошибках, это повлияет на буферизацию вывода и порядок отображения выходных сообщений и сообщений об ошибках.источник
tee -a log >&2 3>&-
Я знаю, что это старый пост, но почему бы просто не сделать это?
И, конечно, если вы хотите стандартный вывод, вы можете просто печатать регулярно.
Вы можете сделать это с любой комбинацией потоков, которую вы пожелаете, просто используя эти две основные команды.
Я знаю, что пришел сюда и не получил легкого для понимания / реализации ответа, надеюсь, это поможет кому-то еще, кто борется.
Между прочим, для noobs, как и мой предыдущий self, все, что
tee
делает команда, это выводит ввод stdin как в stdout, так и в файл (ы), указанные в качестве последующих аргументов.-a
означает добавление, поэтому вы не перезаписываете файл при каждом использовании команды. Если у вас есть дополнительные вопросы, я считаю , это будет очень полезным ресурсом для быстрого обучения Баша.источник
Еще один способ сделать это - использовать перенаправления внутри функций.
Здесь у нас есть
main
функция, которая вызывает все другие функции. Теперь перенаправлятьSTDOUT
иSTDERR
изmain
функцииtee
.источник