Domanda Come posso salvare l'output del terminale in un file?


Come posso salvare l'output di un comando in un file?

C'è un modo senza utilizzare alcun software? Mi piacerebbe sapere come


394
2018-02-14 19:49


origine




risposte:


Sì, è possibile, basta ridirigere l'output in un file:

someCommand > someFile.txt  

O se vuoi aggiungere i dati:

someCommand >> someFile.txt

Se vuoi stderr anche usare questo:

someCommand &> someFile.txt  

o questo per aggiungere:

someCommand &>> someFile.txt  

388
2018-02-14 19:52



Nota che someCommand 2> someFile.txt e someCommand 2>> someFile.txt reindirizza anche stterr su someFile.txt - Slothworks
Sto cercando di farlo con il comando gcc ma non funziona. Funziona con altri comandi, ma non con questo. Crea semplicemente il file di output senza nulla al suo interno. - Nik-Lz
@ Nik-Lz Spesso questo perché il comando sta inviando tutto il suo output su stderr. Se gcc sta generando messaggi di errore, questo sembra probabile. Vedi commento di Slothworks per come catturare stderr invece di stdout. - Jonathan Hartley
NB: per ottenere l'output del make comando in un file richiede invece questa sintassi: make > someFile.txt 2>&1 (fonte: linuxquestions.org/questions/linux-newbie-8/...) - Gabriel Staples
@KyleBridenstine Vedere il tee rispondi sotto (askubuntu.com/a/485762/44179) - Seth♦


Per scrivere l'output di un comando in un file, ci sono fondamentalmente 10 modi comunemente usati.

Panoramica:

Si prega di notare che il n.e. nella colonna della sintassi significa "non esistente".
  C'è un modo, ma è troppo complicato da inserire nella colonna. Puoi trovare un link utile nella sezione Elenco su di esso.

          || visible in terminal ||   visible in file   || existing
  Syntax  ||  StdOut  |  StdErr  ||  StdOut  |  StdErr  ||   file   
==========++==========+==========++==========+==========++===========
    >     ||    no    |   yes    ||   yes    |    no    || overwrite
    >>    ||    no    |   yes    ||   yes    |    no    ||  append
          ||          |          ||          |          ||
   2>     ||   yes    |    no    ||    no    |   yes    || overwrite
   2>>    ||   yes    |    no    ||    no    |   yes    ||  append
          ||          |          ||          |          ||
   &>     ||    no    |    no    ||   yes    |   yes    || overwrite
   &>>    ||    no    |    no    ||   yes    |   yes    ||  append
          ||          |          ||          |          ||
 | tee    ||   yes    |   yes    ||   yes    |    no    || overwrite
 | tee -a ||   yes    |   yes    ||   yes    |    no    ||  append
          ||          |          ||          |          ||
 n.e. (*) ||   yes    |   yes    ||    no    |   yes    || overwrite
 n.e. (*) ||   yes    |   yes    ||    no    |   yes    ||  append
          ||          |          ||          |          ||
|& tee    ||   yes    |   yes    ||   yes    |   yes    || overwrite
|& tee -a ||   yes    |   yes    ||   yes    |   yes    ||  append

Elenco:

  • command > output.txt

    Il flusso di output standard verrà reindirizzato al solo file, non sarà visibile nel terminale. Se il file esiste già, viene sovrascritto.

  • command >> output.txt

    Il flusso di output standard verrà reindirizzato al solo file, non sarà visibile nel terminale. Se il file esiste già, i nuovi dati verranno aggiunti alla fine del file.

  • command 2> output.txt

    Il flusso di errore standard verrà reindirizzato al solo file, non sarà visibile nel terminale. Se il file esiste già, viene sovrascritto.

  • command 2>> output.txt

    Il flusso di errore standard verrà reindirizzato al solo file, non sarà visibile nel terminale. Se il file esiste già, i nuovi dati verranno aggiunti alla fine del file.

  • command &> output.txt

    Sia l'output standard che il flusso di errori standard verranno reindirizzati solo al file, nulla sarà visibile nel terminale. Se il file esiste già, viene sovrascritto.

  • command &>> output.txt

    Sia l'output standard che il flusso di errori standard verranno reindirizzati solo al file, nulla sarà visibile nel terminale. Se il file esiste già, i nuovi dati verranno aggiunti alla fine del file.

  • command | tee output.txt

    Il flusso di output standard verrà copiato nel file, sarà comunque visibile nel terminale. Se il file esiste già, viene sovrascritto.

  • command | tee -a output.txt

    Il flusso di output standard verrà copiato nel file, sarà comunque visibile nel terminale. Se il file esiste già, i nuovi dati verranno aggiunti alla fine del file.

  • (*)

    Bash non ha una sintassi abbreviata che consente di convogliare solo StdErr a un secondo comando, che sarebbe necessario qui in combinazione con tee di nuovo per completare il tavolo. Se hai davvero bisogno di qualcosa del genere, per favore guarda "Come pipe stderr, e non stdout?" su Overflow dello stack per alcuni aspetti, come ciò può essere fatto ad es. scambiando flussi o utilizzando la sostituzione del processo.

  • command |& tee output.txt

    Sia l'output standard che i flussi di errore standard verranno copiati nel file mentre sono ancora visibili nel terminale. Se il file esiste già, viene sovrascritto.

  • command |& tee -a output.txt

    Sia l'output standard che i flussi di errore standard verranno copiati nel file mentre sono ancora visibili nel terminale. Se il file esiste già, i nuovi dati verranno aggiunti alla fine del file.


535
2018-02-08 14:52



Grazie per il tavolo, è eccellente! Questa dovrebbe essere la risposta migliore - DevShark
@ karthick87 Questo non è realmente correlato alla domanda sul reindirizzamento dell'output a un file, perché semplicemente reindirizza uno stream a un altro. 2>&1 reindirizza STDERR a STDOUT, 1>&2 reindirizza STDOUT a STDERR e 3>&1 reindirizzerebbe il flusso 3 a STDERR. - Byte Commander
Solo una nota che "| &" non funzionava per me su macOS. Ciò è dovuto al fatto che ha una versione precedente di bash (credo). Il meno elegante '2> e 1 |' funziona bene però - Danny Parker
che dire di n, y, y, y? - user1133275
@Jas per reindirizzare entrambi gli stream stderr (2) e stdout (1). - Byte Commander


Puoi anche usare tee per inviare l'output a un file:

command | tee ~/outputfile.txt

Una leggera modifica colpirà anche stderr:

command 2>&1 | tee ~/outputfile.txt

o leggermente più corto e meno complicato:

command |& tee ~/outputfile.txt

tee è utile se vuoi essere in grado di cattura l'output del comando mentre lo visualizza anche dal vivo.


81
2018-06-20 04:45



tee è utile se vuoi essere in grado di catturare l'output del comando mentre lo guardi anche dal vivo. Fai questa linea grassetto Aronne. Farà due lavori alla volta. Grazie per la risposta. - learner
Dice che & è inaspettato e non scrive il registro nello stesso momento in cui viene eseguito il comando. Sto usando questo in un file bash tuttavia, fa qualche differenza? - tim687
@ tim687 Ho rimosso quella modifica. Mi dispiace per quello ... non faceva parte della mia risposta originale. - Aaron
@ Aaron Grazie! tee aggiungerà il file in tempo reale, giusto? Ho uno script di backup che uso, lol, backup del mio pc, ma la registrazione non è in tempo reale. Il mio pc va in stop quando il backup è terminato e il file di log è vuoto. Dovrei usare un altro comando per registrare i comandi? - tim687
miliardo grazie fratello - Mahesha999


È possibile reindirizzare l'output del comando a un file:

your_command >/path/to/file

Per aggiungere l'output del comando a un file invece di sovrascriverlo, utilizzare:

your_command >>/path/to/file

17
2018-02-14 19:52



Molte grazie ! c'è qualche limite? come la dimensione massima del file? - led-Zepp
La dimensione massima del file è limitata dal file system - chaos
Questa risposta non salverà stderr. Usa &>, vedi stackoverflow.com/questions/637827/... e tldp.org/LDP/abs/html/io-redirection.html - Panther
L'OP non ha mai chiesto di salvare stderr - chaos


Un miglioramento da considerare -

Vari script iniettano codici colore nell'output che potresti non volere ingombrare nel tuo file di registro.

Per risolvere questo problema, puoi usare il programma sed per spogliare quei codici. Esempio:

command 2>&1 | sed -r 's/'$(echo -e "\033")'\[[0-9]{1,2}(;([0-9]{1,2})?)?[mK]//g' | tee ~/outputfile.txt

11
2017-07-08 20:57



Come salvare l'output in modo che i colori siano conservati? Vorrei importare il risultato di un comando in libreoffice e mantenere i colori. - madrang
@ Sadrang: Ho letto solo il tuo commento ora, ma potresti trovare questo risposta utile. - Sylvain Pineau
Oh, quasi esattamente quello che sto cercando. Come stampare anche sullo schermo l'output? - Sigur
Si noti che molti comandi che producono output colorati, come ad esempio ls e grep, supporto --color=auto, che emette codici colore solo se l'output standard è un terminale. - Eliah Kagan


Per cron lavori ecc. vuoi evitare le estensioni Bash. L'equivalente POSIX sh gli operatori di reindirizzamento sono

Bash            POSIX
--------------  --------------
foo &> bar      foo >bar 2&>1
foo &>> bar     foo >>bar 2>&1
foo |& bar      foo 2>&1 | bar

Noterai che la struttura POSIX è in un certo senso più semplice e diretta. Il &> la sintassi è stata presa in prestito da csh che dovrebbe già convincerti che è una cattiva idea.


1
2018-04-11 12:25





some_command | tee command.log e some_command > command.log hanno il problema che non salvano l'output del comando su command.log file in tempo reale.

Per evitare questo problema e salvare l'output del comando in tempo reale, è possibile aggiungere unbuffer, che viene fornito con il expect pacchetto.


Esempio:

sudo apt-get install expect
unbuffer some_command | tee command.log
unbuffer some_command > command.log

assumendo log.py contiene:

import time
print('testing')
time.sleep(100) # sleeping for 100 seconds

puoi correre unbuffer python log.py | tee command.log o unbuffer python log.py > command.log

Maggiori informazioni: Come posso salvare un output di comando su un file in tempo reale?


0
2017-07-04 20:54



Salvano l'output mentre lo ricevono, il problema è che Python attiva il buffering quando l'output non è un TTY. Altre opzioni per disabilitare questo in Python: stackoverflow.com/q/107705/2072269 - muru