Bir programın çıktısını yeniden yönlendirmenin ve hala stdout'a gitmesinin bir yolu var mı?


24

Tamam. Bir programın çıktısını bir dosyaya yönlendirmek isteseydim, böyle bir şey yapardım.

prog > file

Hem stdout'u hem de stderr'i bu dosyaya yönlendirmek istesem, yapardım

prog > file 2>&1

Çıktının dosyaya gitmesini istiyorsanız, bu her şey yolunda ve iyidir. Fakat çıktının dosyaya gitmesini ve yine de hala stdout / stderr'e gitmesini istiyorsanız? Böylece, çıktı dosyaya kaydedilir, ancak program çalışırken hala konsolda görebilirsiniz. Bunu yapmanın bir yolu var mı? Ve eğer öyleyse, nasıl?


Terminoloji: Demek istediğin ve hala terminale gittiğin . stdoutdosya tanıtıcısı 1'dir ve foo > some_fileüzerinde açılan salt yazılabilir dosya tanıtıcısının some_filefoo stdout olduğu anlamına gelir . stdout her zaman stdout'a gider.
Peter Cordes

Yanıtlar:


39

teebu amaç için var; bir dosya adı argümanı alır ve okuduğu verileri stdin'den hem stdout'a hem de dosyaya yazar:

$ prog 2>&1 | tee file

10
Ve ekstra bash 4 zekâ için: prog |& tee file.
Tobu

1
Ayrıca 'dosya'yı' isimli bir kanalla değiştirebilirsiniz ...
Kevin Cantu

@KevinCantu: Adlandırılmış bir boru yalnızca bir tür dosyadır; bu, her şeyin bir dosya olduğu Unix'tir. Ayrıca prog |& tee /dev/tty > file, bir boru hattının ortasında yararlı olabilecek, örneğin foo |& tee /dev/tty | sed 's/.*\r//' > foo.logterminalinizdeki durum satırı ilerleme güncellemelerini görmek, ancak bunları bir günlük dosyasından filtreleyebilirsiniz. Veya, bu noktada verileri görmenizi sağlayarak birlikte keseceğiniz bir boru hattında hata ayıklamak için kullanın.
Peter Cordes
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.