Чи є спосіб перенаправити висновок програми і все-таки перейти до stdout?


24

Гаразд. Якби я хотів перенаправити вихід програми на файл, я зробив би щось подібне

prog > file

Якби я хотів перенаправити як stdout, так і stderr на цей файл, то я б це зробив

prog > file 2>&1

Це все добре і добре, якщо ви хочете, щоб вихід перейшов у файл. Але що робити, якщо ви хочете, щоб вихід перейшов у файл і все-таки перейшов до stdout / stderr? Отже, вихід зберігається у файлі, але ви все одно можете бачити його на консолі, коли програма працює. Чи є спосіб це зробити? А якщо так, то як?


Термінологія: Ви маєте на увазі і все-таки їдете до терміналу . stdoutє файловим дескриптором 1, і foo > some_fileозначає, що дескриптор файлу лише для запису, відкритий на, some_file- це stdout foo. stdout завжди переходить до stdout.
Пітер Кордес

Відповіді:


39

teeіснує для цього; він приймає аргумент імені файлу і записує дані, які він читає зі stdin, і в stdout, і в файл:

$ prog 2>&1 | tee file

10
А для додаткової Баш-дотепності: prog |& tee file.
Тобу

1
Ви також можете замінити "файл" на названу трубку ...
Кевін Канту

@KevinCantu: названа труба - це лише один тип файлу; це Unix, де все є файлом. Ви також можете prog |& tee /dev/tty > file, що може бути корисно в середині трубопроводу, наприклад, foo |& tee /dev/tty | sed 's/.*\r//' > foo.logщоб побачити оновлення прогресу в рядку статусу на своєму терміналі, але відфільтрувати їх з файлу журналу. Або скористайтеся ним для налагодження конвеєра, який ви взломали, дозволяючи вам бачити дані в цій точці.
Пітер Кордес
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.