Apakah ada cara untuk mengarahkan kembali output program dan tetap menjalankannya ke stdout?

24

Baik. Jika saya ingin mengarahkan output suatu program ke file, saya akan melakukan sesuatu seperti ini

prog > file

Jika saya ingin mengarahkan stdout dan stderr ke file itu, maka saya akan melakukannya

prog > file 2>&1

Ini semua baik dan bagus jika Anda ingin output masuk ke file. Tetapi bagaimana jika Anda ingin output untuk pergi ke file dan masih pergi ke stdout / stderr? Jadi, output disimpan dalam file, tetapi Anda masih bisa melihatnya di konsol saat program sedang berjalan. Apakah ada cara untuk melakukan itu? Dan jika demikian, bagaimana?

Jonathan M Davis
sumber
Terminologi: Maksud Anda dan masih pergi ke terminal . stdoutadalah file-deskriptor 1, dan foo > some_fileberarti deskriptor file tulis saja yang dibuka some_fileadalah foo's stdout. stdout selalu pergi ke stdout.
Peter Cordes

Jawaban:

39

teeada untuk tujuan ini; dibutuhkan argumen nama file dan menulis data yang dibaca dari stdin ke stdout dan file:

$ prog 2>&1 | tee file
Michael Mrozek
sumber
10
Dan untuk tambahan pesta 4 kelucuan: prog |& tee file.
Tobu
1
Anda juga dapat mengganti 'file' dengan pipa bernama ...
Kevin Cantu
@KevinCantu: Pipa bernama hanya satu jenis file; ini adalah Unix di mana semuanya adalah file. Anda juga dapat prog |& tee /dev/tty > file, yang dapat berguna di tengah-tengah jalur pipa, misalnya foo |& tee /dev/tty | sed 's/.*\r//' > foo.loguntuk melihat pembaruan progres baris-status pada terminal Anda, tetapi memfilternya dari file log. Atau gunakan untuk men-debug pipa yang sedang diretas bersama dengan membiarkan Anda melihat data pada saat itu.
Peter Cordes