Risposte:
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)
makecomando in un file richiede invece questa sintassi: make > someFile.txt 2>&1(fonte: linuxquestions.org/questions/linux-newbie-8/… )
Per scrivere l'output di un comando in un file, ci sono sostanzialmente 10 modi comunemente usati.
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
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.
2>&1reindirizza STDERR su STDOUT, 1>&2reindirizza STDOUT su STDERR e 3>&1reindirizzerebbe il flusso 3 su STDERR.
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.
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.
È 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 .
2>&1?
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
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
lse grep, supportano --color=auto, che emettono codici colore solo se l'output standard è un terminale.
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.
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?
someCommand 2> someFile.txtesomeCommand 2>> someFile.txtreindirizza anchestterrper somefile.txt