$ program [arguments...] 2>&1 | tee outfile
2>&1
scarica i flussi stderr e stdout.
tee outfile
prende il flusso che ottiene e lo scrive sullo schermo e nel file "outfile".
Questo è probabilmente ciò che la maggior parte delle persone sta cercando. La probabile situazione è che alcuni programmi o script stiano lavorando duramente da molto tempo e producano molto output. L'utente desidera controllarlo periodicamente per verificare l'avanzamento, ma desidera anche che l'output sia scritto in un file.
Il problema (specialmente quando si mescolano flussi stdout e stderr) è che si fa affidamento sui flussi scaricati dal programma. Se, ad esempio, tutte le scritture su stdout non vengono scaricate, ma tutte le scritture su stderr vengono scaricate, finiranno per finire in ordine cronologico nel file di output e sullo schermo.
È anche un male se il programma emette solo 1 o 2 righe ogni pochi minuti per segnalare i progressi. In tal caso, se l'output non è stato scaricato dal programma, l'utente non vedrebbe nemmeno alcun output sullo schermo per ore, perché nessuno verrebbe spinto attraverso il tubo per ore.
Aggiornamento: il programma unbuffer
, parte del expect
pacchetto, risolverà il problema del buffering. Ciò farà sì che stdout e stderr scrivano immediatamente sullo schermo e sul file e li mantengano sincronizzati quando vengono combinati e reindirizzati tee
. Per esempio:
$ unbuffer program [arguments...] 2>&1 | tee outfile