Как записать вывод в bash и увидеть его в терминале одновременно? - PullRequest
22 голосов
/ 09 июля 2010

У меня есть несколько сценариев, в которых мне нужно увидеть выходные данные и записать результат в файл, самый простой пример:

$ update-client > my.log

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

Ответы [ 4 ]

39 голосов
/ 09 июля 2010
update-client 2>&1 | tee my.log

2> & 1 перенаправляет стандартную ошибку на стандартный вывод, и tee отправляет свой стандартный ввод на стандартный вывод и файл.

4 голосов
/ 15 августа 2012

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

Пример

#!/bin/bash 
{
  echo "I will be sent to screen and file"
  ls ~
} 2>&1 | tee -a /tmp/logfile.log

echo "I will be sent to just terminal"

Мне нравится иметь больше контроля и гибкости - поэтому я предпочитаю этот путь.

4 голосов
/ 09 июля 2010

Просто используйте tail, чтобы посмотреть, как обновляется файл.Создайте фон для исходного процесса, добавив & после указанной выше команды. После выполнения указанной выше команды просто используйте

$ tail -f my.log

. Она будет постоянно обновляться.(обратите внимание, что он не сообщит вам, когда файл завершится, поэтому вы можете вывести что-то в журнал, чтобы сообщить, что он завершен. Ctrl-c для выхода из tail)

2 голосов
/ 18 февраля 2016

Для этого вы можете использовать команду tee:

command | tee /path/to/logfile

Эквивалент без записи в оболочку будет:

command > /path/to/logfile

Если вы хотите добавить (>>) и показать вывод в оболочке, используйте опцию -a:

command | tee -a /path/to/logfile

Обратите внимание, что канал будет ловить только стандартный вывод, ошибки в стандартный поток ошибок не обрабатываются каналом с тройником Если вы хотите регистрировать ошибки (из stderr), используйте:

command 2>&1 | tee /path/to/logfile

Это означает: запустить команду и перенаправить поток stderr (2) в stdout (1). Это будет передано в трубу с приложением тройника.

Узнайте об этом на сайте askubuntu

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