Как перенаправить вывод в файл и stdout

в bash, называя foo будет выводиться из этой команды на stdout.

вызов foo > output перенаправит любой вывод из этой команды в указанный файл (в данном случае "вывод").

есть ли способ перенаправить вывод в файл и отобразить его в stdout?

9 ответов


команда, которую вы хотите, называется tee:

foo | tee output.file

например, если вы заботитесь только о stdout:

ls -a | tee output.file

если вы хотите включить устройство, выполните:

program [arguments...] 2>&1 | tee outfile

2>&1 перенаправляет канал 2 (stderr/Стандартная ошибка) в канал 1 (stdout/стандартный вывод), так что оба записываются как stdout. Он также направляется в данный выходной файл по состоянию на .

кроме того, если вы хотите добавить в файл журнала используйте tee -a as:

program [arguments...] 2>&1 | tee -a outfile

$ program [arguments...] 2>&1 | tee outfile

2>&1 сбрасывает потоки stderr и stdout. tee outfile берет поток и записывает его на экран и в файл "файл".

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

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

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

обновление: программа unbuffer, часть expect пакет, разрешит проблему буферизации. Это заставит stdout и stderr немедленно записывать на экран и файл и синхронизировать их при объединении и перенаправлении на tee. Например:

$ unbuffer program [arguments...] 2>&1 | tee outfile

еще один способ, который работает для меня,

<command> |& tee  <outputFile>

как показано в руководство gnu bash

пример:

ls |& tee files.txt

если ‘|&’ используется, command1 все Стандартная ошибка, кроме стандартный вывод, подключен к стандартному входу command2 через трубу; это сокращение 2>&1 |. Выполняется неявное перенаправление стандартной ошибки на стандартный вывод после любых перенаправлений, указанных командой.

для получения дополнительной информации см. перенаправление


вы можете в первую очередь использовать Zoredache решение, но если вы не хотите перезаписывать выходной файл, вы должны написать tee с-опция следующим образом:

ls -lR / | tee -a output.file

что-то добавить ...

пакет unbuffer имеет проблемы с поддержкой некоторых пакетов в версиях fedora и redhat unix.

отложив неприятности

следующие работал для меня

bash myscript.sh 2>&1 | tee output.log

спасибо ScDF & Матвей ваши входы сэкономили мне много времени..


С помощью tail -f output должны работать.


Бонусный ответ, так как этот случай использования привел меня сюда:

в случае, если вам нужно сделать это как какой-то другой пользователь

echo "some output" | sudo -u some_user tee /some/path/some_file

обратите внимание, что Эхо произойдет, как вы и запись файла произойдет как "some_user", что будет не работа, если вы должны были запустить echo как " some_user "и перенаправить вывод с > > "some_file", потому что перенаправление файла произойдет как вы.

подсказка: tee также поддерживает добавление с флагом-a, если вам нужно заменить строку в файле другим пользователем, вы можете выполнить sed как желаемый пользователь.


< command > |& tee filename # это создаст файл "filename" со статусом команды в качестве содержимого, если файл уже существует, он удалит существующее содержимое и запишет статус команды.

< command > | tee >> filename # это добавит статус к файлу, но он не печатает статус команды на standard_output (экран).

Я хочу напечатать что-то, используя "эхо" на экране и добавить, что Эхо данных в файл

echo "hi there, Have to print this on screen and append to a file" 

тройник идеально подходит для этого, но это также сделает работу

ls -lr / > output | cat output