Risposte:
Sì, è possibile, reindirizzare l'output su un file:
SomeCommand > SomeFile.txt
O se si desidera aggiungere dati:
SomeCommand >> SomeFile.txt
Se vuoi stderr
usare anche questo:
SomeCommand &> SomeFile.txt
o questo per aggiungere:
SomeCommand &>> SomeFile.txt
se vuoi avere entrambi stderr
e 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 2
sopra)
make
comando 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 tee
nuovo 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>&1
reindirizza STDERR su STDOUT, 1>&2
reindirizza STDOUT su STDERR e 3>&1
reindirizzerebbe il flusso 3 su STDERR.
sh: 1: Syntax error: "&" unexpected
quando uso |& tee
da uno script Python in un server c9.io. Sembra che venga utilizzata una shell diversa. echo $SHELL
mostra /bin/bash
e $SHELL --version
mostra la versione 4.3.11 (1) -release. Ho provato #!/bin/bash
con 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 sh
e bash
sul mio server. Grazie.
sh
e non bash
(o forse bash
in sh
modalità ...). Puoi controllare esattamente cosa sta usando il tuo attuale processo di shell ps -p $$ -o cmd=
, perché echo $SHELL
non è affidabile e ti mostrerà la tua shell di login, ignorando se potresti aver avviato una sottoshell diversa.
È inoltre possibile utilizzare tee
per 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
ls
e grep
, supportano --color=auto
, che emettono codici colore solo se l'output standard è un terminale.
Per cron
lavori ecc. Si desidera evitare le estensioni di Bash. Gli equivalenti sh
operatori 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 csh
cui dovrebbe già convincerti che è una cattiva idea.
some_command | tee command.log
e some_command > command.log
hanno il problema di non salvare l'output del comando nel command.log
file in tempo reale.
Per evitare questo problema e salvare l'output del comando in tempo reale, è possibile aggiungere unbuffer
, fornito con il expect
pacchetto.
Esempio:
sudo apt-get install expect
unbuffer some_command | tee command.log
unbuffer some_command > command.log
Supponendo che log.py
contenga:
import time
print('testing')
time.sleep(100) # sleeping for 100 seconds
puoi correre unbuffer python log.py | tee command.log
ounbuffer python log.py > command.log
Ulteriori informazioni: Come posso salvare l'output di un comando in un file in tempo reale?
someCommand 2> someFile.txt
esomeCommand 2>> someFile.txt
reindirizza anchestterr
per somefile.txt