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


690

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

C'è un modo senza usare alcun software? Vorrei sapere come.

Risposte:


737

Sì, è possibile, reindirizzare l'output su un file:

SomeCommand > SomeFile.txt  

O se si desidera aggiungere dati:

SomeCommand >> SomeFile.txt

Se vuoi stderrusare anche questo:

SomeCommand &> SomeFile.txt  

o questo per aggiungere:

SomeCommand &>> SomeFile.txt  

se vuoi avere entrambi stderre l'output visualizzato sulla console e in un file usa questo:

SomeCommand 2>&1 | tee SomeFile.txt

(Se si desidera solo l'output, rilasciare quanto 2sopra)


15
Si noti che someCommand 2> someFile.txte someCommand 2>> someFile.txtreindirizza anche stterrper somefile.txt
Slothworks

Sto provando a 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.
Nikos,

@ 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 il commento di Slothworks per come catturare stderr invece di stdout.
Jonathan Hartley,

1
NB: per ottenere l'output del makecomando in un file richiede invece questa sintassi: make > someFile.txt 2>&1(fonte: linuxquestions.org/questions/linux-newbie-8/… )
Gabriel Staples

Ho un problema che smette di scrivere quando il file raggiunge circa 8 MB. È un limite noto?
relG

865

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

Panoramica:

Si noti che n.e.nella colonna della sintassi significa "non esistente".
C'è un modo, ma è troppo complicato per adattarsi alla colonna. Puoi trovare un link utile nella sezione Elenco a riguardo.

          || 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 solo al file, non sarà visibile nel terminale. Se il file esiste già, viene sovrascritto.

  • command >> output.txt

    Il flusso di output standard verrà reindirizzato solo al 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 solo al file, non sarà visibile nel terminale. Se il file esiste già, viene sovrascritto.

  • command 2>> output.txt

    Il flusso di errore standard verrà reindirizzato solo al 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 il piping di StdErr solo a un secondo comando, che sarebbe necessario qui in combinazione con di teenuovo per completare la tabella. Se hai davvero bisogno di qualcosa del genere, guarda "Come convogliare stderr e non stdout?" su Stack Overflow per alcuni modi in cui ciò può essere fatto, ad esempio scambiando flussi o usando la sostituzione del processo.

  • command |& tee output.txt

    Sia l'output standard che i flussi di errore standard verranno copiati nel file pur restando 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 pur restando visibili nel terminale. Se il file esiste già, i nuovi dati verranno aggiunti alla fine del file.


66
Grazie per la tavola, è eccellente! Questa dovrebbe essere la risposta migliore
DevShark,

3
@ karthick87 Questo non è in realtà correlato alla domanda sul reindirizzamento dell'output su un file, perché reindirizza solo uno stream a un altro. 2>&1reindirizza STDERR su STDOUT, 1>&2reindirizza STDOUT su STDERR e 3>&1reindirizzerebbe il flusso 3 su STDERR.
Byte Commander

18
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> & 1 |" funziona benissimo però
Danny Parker

2
@ByteCommander Ottengo l'errore: sh: 1: Syntax error: "&" unexpectedquando uso |& teeda uno script Python in un server c9.io. Sembra che venga utilizzata una shell diversa. echo $SHELLmostra /bin/bashe $SHELL --versionmostra la versione 4.3.11 (1) -release. Ho provato #!/bin/bashcon il mio script Python ma ho ancora sh: 1: Syntax error. Ho ottenuto ciò di cui avevo bisogno, quindi mi sto arrendendo all'ordinamento delle stranezze tra she bashsul mio server. Grazie.
samkhan13,

1
@ samkhan13 sembra che tu stia correndo she non bash(o forse bashin shmodalità ...). Puoi controllare esattamente cosa sta usando il tuo attuale processo di shell ps -p $$ -o cmd=, perché echo $SHELLnon è affidabile e ti mostrerà la tua shell di login, ignorando se potresti aver avviato una sottoshell diversa.
Byte Commander

108

È inoltre possibile utilizzare teeper inviare l'output a un file:

command | tee ~/outputfile.txt

Una leggera modifica catturerà 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 catturare l'output del comando mentre lo visualizzi anche dal vivo .


Dice che & è inatteso e non scrive il registro contemporaneamente all'esecuzione del comando. Sto usando questo in un file bash, questo fa differenza?
tim687,

@ tim687 Ho rimosso quella modifica. Mi dispiace per quello ... non faceva parte della mia risposta originale.
Aaron,

@Aaron Grazie! Ti aggiungerò il file in tempo reale, giusto? Ho uno script di backup che utilizzo, lol, backup del mio PC, ma la registrazione non è in tempo reale. Il mio pc si mette in sospensione al termine del backup e il file di registro è vuoto. Dovrei usare un altro comando per registrare i comandi?
tim687,

come interpreto il significato di 2>&1?
Mahesha999,

@ Mahesha999 2 è il descrittore di file per STDERR e 1 è per STDOUT. In modo che 2> & 1 invii STDERR a STDOUT. Questa domanda SO lo spiega abbastanza bene: stackoverflow.com/questions/818255/…
Aaron

20

Puoi reindirizzare l'output del comando su un file:

your_command >/path/to/file

Per aggiungere l'output del comando a un file anziché sovrascriverlo, utilizzare:

your_command >>/path/to/file

Molte grazie ! c'è qualche limite? come la dimensione massima del file?
led-Zepp

3
La dimensione massima del file è appena limitata dal file system
caos,

Questa risposta non salverà stderr. Utilizzare &>, vedere stackoverflow.com/questions/637827/... e tldp.org/LDP/abs/html/io-redirection.html
Panther

3
L'OP non ha mai chiesto di salvare stderr
caos il

Dice "Nessun file o directory". È anche possibile creare automaticamente le directory?
Qwerty

14

Un miglioramento da considerare -

Vari script inseriranno nell'output codici colore che potrebbero non essere ingombranti nel file di registro.

Per risolvere questo problema, è possibile utilizzare il programma sed per eliminare 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

1
Come salvare l'output in modo da conservare i colori? Vorrei importare il risultato di un comando in libreoffice e mantenere i colori.
madrang,

@madrang: ho letto il tuo commento solo ora ma potresti trovare utile questa risposta .
Sylvain Pineau,

Oh, quasi esattamente quello che sto cercando. Come stampare anche sullo schermo l'output?
Sigur,

1
Si noti che molti comandi che producono output colorati, come lse grep, supportano --color=auto, che emettono codici colore solo se l'output standard è un terminale.
Eliah Kagan,

5

Per cronlavori ecc. Si desidera evitare le estensioni di Bash. Gli equivalenti shoperatori di reindirizzamento POSIX sono

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

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


1

some_command | tee command.loge some_command > command.loghanno il problema di non salvare l'output del comando nel command.logfile in tempo reale.

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


Esempio:

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

Supponendo che log.pycontenga:

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

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

Ulteriori informazioni: Come posso salvare l'output di un comando in un file in tempo reale?


Salvano l'output mentre lo ricevono, il problema è che python attiva il buffering quando l'output non è su un TTY. Altre opzioni per disabilitare questo in Python: stackoverflow.com/q/107705/2072269
muru
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.