Gibt es eine Möglichkeit, die Ausgabe eines Programms umzuleiten und trotzdem auf stdout zu setzen?

24

Okay. Wenn ich die Ausgabe eines Programms in eine Datei umleiten wollte, würde ich so etwas tun

prog > file

Wenn ich sowohl stdout als auch stderr in diese Datei umleiten wollte, würde ich tun

prog > file 2>&1

Das ist alles in Ordnung und gut, wenn die Ausgabe in die Datei gehen soll. Aber was ist, wenn die Ausgabe in die Datei und dennoch in stdout / stderr erfolgen soll? Die Ausgabe wird also in der Datei gespeichert, Sie können sie jedoch weiterhin auf der Konsole sehen, während das Programm ausgeführt wird. Gibt es eine Möglichkeit, das zu tun? Und wenn ja, wie?

Jonathan M Davis
quelle
Terminologie: Du meinst und gehst immer noch zum Terminal . stdoutist Dateideskriptor 1 und foo > some_filebedeutet, dass ein schreibgeschützter Dateideskriptor, der auf " some_filefoo's stdout" geöffnet ist. stdout geht immer zu stdout.
Peter Cordes

Antworten:

39

teeexistiert zu diesem Zweck; Es verwendet ein Dateinamenargument und schreibt die von stdin gelesenen Daten sowohl in stdout als auch in die Datei:

$ prog 2>&1 | tee file
Michael Mrozek
quelle
10
Und für noch mehr bash 4 Niedlichkeit: prog |& tee file.
Tobu
1
Sie können "file" auch durch eine Named Pipe ersetzen ...
Kevin Cantu
@ KevinCantu: Eine Named Pipe ist nur ein Dateityp. Dies ist Unix, wo alles eine Datei ist. Sie können auch prog |& tee /dev/tty > file, was in der Mitte einer Pipeline nützlich sein kann, z. B. foo |& tee /dev/tty | sed 's/.*\r//' > foo.logStatuszeilenfortschrittsaktualisierungen auf Ihrem Terminal anzeigen, diese jedoch aus einer Protokolldatei herausfiltern. Oder verwenden Sie es, um eine Pipeline zu debuggen, die Sie gemeinsam hacken, indem Sie die Daten an diesem Punkt anzeigen lassen.
Peter Cordes