Il comando desiderato si chiama tee
:
foo | tee output.file
Ad esempio, se ti interessa solo stdout:
ls -a | tee output.file
Se vuoi includere stderr, fai:
program [arguments...] 2>&1 | tee outfile
2>&1
reindirizza il canale 2 (stderr/errore standard) nel canale 1 (stdout/output standard), in modo tale che entrambi siano scritti come stdout. È anche indirizzato al file di output specificato a partire dal tee
comando.
Inoltre, se vuoi aggiungere al file di log, usa tee -a
come:
program [arguments...] 2>&1 | tee -a outfile
$ program [arguments...] 2>&1 | tee outfile
2>&1
scarica i flussi stderr e stdout.tee outfile
prende il flusso che riceve e lo scrive sullo schermo e nel file "outfile".
Questo è probabilmente ciò che la maggior parte delle persone sta cercando. La situazione probabile è che qualche programma o script stia lavorando duramente per molto tempo e producendo molto output. L'utente desidera verificarne periodicamente l'avanzamento, ma desidera anche che l'output venga scritto in un file.
Il problema (soprattutto quando si mescolano flussi stdout e stderr) è che si fa affidamento sui flussi che vengono scaricati dal programma. Se, ad esempio, tutte le scritture su stdout sono not svuotato, ma tutte le scritture su stderr lo sono svuotati, finiranno fuori ordine cronologico nel file di output e sullo schermo.
È anche negativo se il programma emette solo 1 o 2 righe ogni pochi minuti per segnalare i progressi. In tal caso, se l'output non fosse scaricato dal programma, l'utente non vedrebbe nemmeno alcun output sullo schermo per ore, perché nessuno di questi verrebbe spinto attraverso la pipe 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 a tee
. Ad esempio:
$ unbuffer program [arguments...] 2>&1 | tee outfile
Un altro modo che funziona per me è,
<command> |& tee <outputFile>
come mostrato nel manuale di gnu bash
Esempio:
ls |& tee files.txt
Se viene utilizzato '|&', errore standard di command1 , oltre al suo output standard , è connesso all'input standard di command2 attraverso la pipe; è abbreviazione di 2>&1 |. Questo reindirizzamento implicito dell'errore standard allo standard output viene eseguito dopo qualsiasi reindirizzamento specificato dal comando.
Per ulteriori informazioni, fare riferimento al reindirizzamento