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.
tee
comando scrive stdin
nei file e anche in stdout
. Se non vuoi che l'output appaia sul terminale, devi reindirizzare /dev/null
come 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 cmd
due 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/null
reindirizzamento, 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/null
te, 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 tee
risposte 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 zsh
manuale 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
file1
passare attraverso file8
i 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
tee
comando è già stato menzionato.
zsh
, puoi usaresome_command >output_log_1 >output_log_2
.