come reindirizzare l'output su più file di registro


52

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

6
Con zsh, puoi usare some_command >output_log_1 >output_log_2.
jofel,

Risposte:


70

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

lo stderr può anche essere reindirizzato in più di un file?
fromababoo,

Sì, può essere fatto in virtù del reindirizzamento: find / -name test 2> & 1 | tee file1 file2 file3
akond

@akond, 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.
raddoppiato

@doubledecker Il teecomando scrive stdinnei file e anche in stdout. Se non vuoi che l'output appaia sul terminale, devi reindirizzare /dev/nullcome faresti normalmente.
Minix,

4
È anche possibile aggiungere a più file:echo test | tee --append file1 file2
user1364368

13

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.


@doubledecker: sembra che soddisfi le tue condizioni, quindi può essere accettato come risposta. Inoltre, +1 come ho testato sotto GNU bash ( version 4.3.11(1)-release (i686-pc-linux-gnu)) in Ubuntu 14.04.
belacqua,

9

È 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

questo è più o meno quello che ha detto l'altra risposta (tranne che -a in tee)
Archemar,

Questa è la strada da percorrere.
71GA,

5

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.


2

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

2
In che modo è davvero diverso dalle altre risposte già fornite? Soprattutto perché poche persone probabilmente vogliono letteralmente file1passare attraverso file8i loro nomi e quelli sono probabilmente solo segnaposto di esempio per i nomi dei file
Eric Renouf,

1
Probabile o no, questa è esattamente la soluzione di cui avevo bisogno, e ho pensato che potesse aiutare qualcun altro.
user149146,

-2

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


Il teecomando è già stato menzionato.
RalfFriedl
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.