Как перенаправить вывод в файл и 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 |. Выполняется неявное перенаправление стандартной ошибки на стандартный вывод после любых перенаправлений, указанных командой.
для получения дополнительной информации см. перенаправление
Бонусный ответ, так как этот случай использования привел меня сюда:
в случае, если вам нужно сделать это как какой-то другой пользователь
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"