Есть ли способ перенаправить вывод программы, и все же он должен идти на стандартный вывод?

24

Хорошо. Если бы я хотел перенаправить вывод программы в файл, я бы сделал что-то вроде этого

prog > file

Если бы я хотел перенаправить как stdout, так и stderr в этот файл, то я бы сделал

prog > file 2>&1

Это все хорошо, если вы хотите, чтобы вывод шел в файл. Но что, если вы хотите, чтобы вывод шел в файл и все же шел в stdout / stderr? Таким образом, вывод сохраняется в файле, но вы все равно можете увидеть его на консоли во время работы программы. Есть ли способ сделать это? И если да, то как?

Джонатан М Дэвис
источник
Терминология: Вы имеете в виду и все еще идете к терминалу . stdoutэто дескриптор файла 1 и foo > some_fileозначает, что дескриптор файла, some_fileдоступный только для записи, это стандартный вывод foo. стандартный вывод всегда идет в стандартный вывод.
Питер Кордес

Ответы:

39

teeсуществует для этой цели; он принимает аргумент имени файла и записывает данные, которые он читает из стандартного ввода, как в стандартный вывод, так и в файл:

$ prog 2>&1 | tee file
Михаил Мрозек
источник
10
И для дополнительного bash 4 привлекательности prog |& tee file.
Тобу
1
Вы также можете заменить «файл» именованным каналом ...
Кевин Канту
@KevinCantu: именованный канал - это только один тип файла; это Unix, где все является файлом. Вы также можете prog |& tee /dev/tty > file, что может быть полезно в середине конвейера, например, foo |& tee /dev/tty | sed 's/.*\r//' > foo.logдля просмотра обновлений о состоянии строки состояния на вашем терминале, но отфильтровывать их из файла журнала. Или используйте его для отладки конвейера, который вы взламываете вместе, позволяя вам увидеть данные в этот момент.
Питер Кордес