Вывод MD5SUM для экрана и файла в сценарии bash [дубликат]

660
задан Mike 19 June 2014 в 08:56
поделиться

8 ответов

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

foo | tee output.file

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

ls -a | tee output.file

Если вы хотите включить stderr, do:

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

2>&1 перенаправляет канал 2 (stderr / стандартная ошибка) в канал 1 (стандартный вывод / стандартный вывод), так что оба они записываются как stdout. Кроме того, если вы хотите добавить в файл журнала, используйте tee -a как:

program [arguments...] 2>&1 | tee -a outfile
889
ответ дан gustafbstrom 23 August 2018 в 23:11
поделиться

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

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

Отказ от проблем

После работы для меня

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

Спасибо ScDF & amp; matthew ваши входы сэкономили мне много времени.

16
ответ дан Community 23 August 2018 в 23:11
поделиться

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

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

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

echo "hi there, Have to print this on screen and append to a file" 
0
ответ дан FrankerZ 23 August 2018 в 23:11
поделиться

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

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

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

Обратите внимание, что эхо произойдет так как вы и запись файла будут выполняться как «some_user», что НЕ будет работать, если вы должны запустить echo как «some_user» и перенаправить вывод с помощью «some_file», потому что перенаправление файлов произойдет как вы.

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

3
ответ дан jorfus 23 August 2018 в 23:11
поделиться
$ program [arguments...] 2>&1 | tee outfile

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

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

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

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

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

$ unbuffer program [arguments...] 2>&1 | tee outfile
441
ответ дан Matthew Alpert 23 August 2018 в 23:11
поделиться

с использованием tail -f output должен работать.

7
ответ дан pkyeck 23 August 2018 в 23:11
поделиться

tee идеально подходит для этого, но это также выполнит задание

ls -lr / > output | cat output
-10
ответ дан Sumit Singh 23 August 2018 в 23:11
поделиться

Другим способом, который работает для меня, является

<command> |& tee  <outputFile>

, как показано в gnu bash manual

Пример:

ls |& tee files.txt

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

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

92
ответ дан tsenapathy 23 August 2018 в 23:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: