Come reindirizzare l'output standard su più file di registro? Quanto segue non funziona:
some_command 1> output_log_1 output_log_2 2>&1
Come reindirizzare l'output standard su più file di registro? Quanto segue non funziona:
some_command 1> output_log_1 output_log_2 2>&1
Risposte:
Vedi man tee:
NOME: tee - leggi dallo standard input e scrivi nello standard output e nei file
SINOSSI: tee [OPZIONE] ... [FILE] ...
Di conseguenza:
echo test | tee file1 file2 file3
cmd 2>&1 | tee log1 log2 ho provato a eseguire come sopra, ma devo premere ctrl-c per reindirizzarlo al secondo file di registro. anche l'output è stampato sulla console. Voglio che l'output del comando venga reindirizzato ai log ma non sulla console. ogni aiuto è apprezzato.
teecomando scrive stdinnei file e anche in stdout. Se non vuoi che l'output appaia sul terminale, devi reindirizzare /dev/nullcome faresti normalmente.
echo test | tee --append file1 file2
Supponiamo che il tuo output sia generato da una funzione cmd():
cmd() {
echo hello world!
}
Per reindirizzare l'output da cmddue file, ma non dalla console, è possibile utilizzare:
cmd | tee file1 file2 >/dev/null
Questo funzionerà per più file, date tutte le tubazioni dell'origine dati da inserire:
echo "foobarbaz" | tee file1 file2 file3 file4 > /dev/null
Questo funzionerà anche:
echo $(cmd) | tee file1 file2 >/dev/null
Senza il /dev/nullreindirizzamento, tee invierà l'output a stdout oltre ai file specificati.
Ad esempio, se questo viene eseguito dalla console, vedrai l'output lì. Eseguito da un crontab, l'output apparirà il messaggio di stato che ti viene inviato (vedi anche la risposta di Gilles qui https://unix.stackexchange.com/a/100833/3998 ).
Questo ha funzionato per me in bash su Ubuntu 12.04 ed è stato verificato in Ubuntu 14.04 usando GNU bash 4.3.11 (1), quindi dovrebbe funzionare su qualsiasi versione recente di GNU bash.
version 4.3.11(1)-release (i686-pc-linux-gnu)) in Ubuntu 14.04.
È un vecchio post ma l'ho appena trovato ora ...
Invece di reindirizzare l'output a > /dev/nullte, puoi reindirizzarlo all'ultimo file:
echo "foobarbaz" | tee file1 > file2
O per aggiungere l'output:
echo "foobarbaz" | tee -a file1 >> file2
-a in tee)
Come @jofel ha menzionato in un commento sotto la risposta, questo può essere fatto in modo nativo in zsh:
echo foobar >file1 >file2 >file3
oppure, con espansione di parentesi graffe:
echo foobar >file{1..3}
Internamente funziona in modo molto simile alle teerisposte fornite sopra. La shell collega lo stdout del comando a un processo che si reindirizza a più file; Pertanto, non c'è alcun vantaggio tecnico impellente di fare in questo modo (ma non sembra vero bene). Consulta il zshmanuale per ulteriori informazioni.
Impossibile commentare, tuttavia, un altro modo di esprimere
echo "foobarbaz" | tee file1 file2 file3 file4 file5 file6 file7 file8 > /dev/null
Potrebbe essere semplificato a questo, quando si ha a che fare con molti file.
echo "foobarbaz" | tee file{1..8} > /dev/null
file1passare attraverso file8i loro nomi e quelli sono probabilmente solo segnaposto di esempio per i nomi dei file
Avevo bisogno di un file di registro delle sessioni e di un altro file per tutte le sessioni che ho fatto:
echo blabla |tee thisession >>allsessions
teecomando è già stato menzionato.
zsh, puoi usaresome_command >output_log_1 >output_log_2.