GNU/Linux >> Linux Esercitazione >  >> Linux

Come reindirizzare l'output su un file e stdout

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


Linux
  1. Come reindirizzare l'output di un programma su un file zip?

  2. Output su Stdout e allo stesso tempo Grep in un file?

  3. Come reindirizzare l'output di un programma e continuare a farlo andare a Stdout?

  4. Come reindirizzare Stderr e Stdout su file diversi e visualizzarli anche nel terminale?

  5. Qual è la differenza nel reindirizzare un output usando >, &>, >&e 2&>?

Come reindirizzare stderr a stdout in Bash

Come reindirizzare l'output del comando della shell

Reindirizzamento e uscita del tubo?

Come reindirizzare l'output di un processo già in esecuzione

Reindirizza tutto l'output su file in Bash

L'output del comando reindirizza al file e al terminale