C'è un modo per reindirizzare l'output di un programma e farlo passare allo stdout?


24

Va bene. Se volessi reindirizzare l'output di un programma su un file, farei qualcosa del genere

prog > file

Se volessi reindirizzare sia stdout che stderr su quel file, lo farei

prog > file 2>&1

Va bene se vuoi che l'output vada al file. Ma cosa succede se si desidera che l'output vada nel file e continui comunque a stdout / stderr? Pertanto, l'output viene salvato nel file, ma è ancora possibile vederlo sulla console mentre il programma è in esecuzione. C'è un modo per farlo? E se sì, come?


Terminologia: intendi e vai ancora al terminale . stdoutè il descrittore di file 1 e foo > some_filesignifica che un descrittore di file di sola scrittura aperto su some_fileè lo stdout di foo. stdout va sempre su stdout.
Peter Cordes,

Risposte:


39

teeesiste a questo scopo; prende un argomento nomefile e scrive i dati che legge da stdin sia su stdout che sul file:

$ prog 2>&1 | tee file

10
E per extra bash 4 carineria: prog |& tee file .
Tobu,

1
Puoi anche sostituire "file" con una pipe denominata ...
Kevin Cantu,

@KevinCantu: una pipe denominata è solo un tipo di file; questo è Unix dove tutto è un file. Puoi anche prog |& tee /dev/tty > file, che può essere utile nel mezzo di una pipeline, ad esfoo |& tee /dev/tty | sed 's/.*\r//' > foo.log per visualizzare gli aggiornamenti sull'avanzamento della linea di stato sul terminale, ma filtrarli da un file di registro. O usalo per eseguire il debug di una pipeline che stai hackerando insieme facendoti vedere i dati a quel punto.
Peter Cordes,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.