Cattura di STDERR e STDOUT su file usando tee


15

Non sono chiaro quale sia l'ordine migliore per acquisire entrambi STDERRe STDOUTnello stesso file usando tee. So che se voglio reindirizzare a un file devo mappare il filehandle dopo il reindirizzamento, cioè

find . >/tmp/output.txt 2>&1

Questo istruisce la shell per inviare STDOUTa /tmp/output.txte poi inviare STDERRa STDOUT(che sta inviando a /tmp/output.txt).

Tentare di eseguire 2>&1prima di reindirizzare il file non avrà l'effetto desiderato.

Tuttavia, quando voglio pipe usando teedovrebbe essere:

find . |tee /tmp/output.txt 2>&1   # or
find . 2>&1 |tee /tmp/output.txt   # ?

Risposte:


18

L'ultimo; si assicura che STDOUT e STDERR del comando originale vadano allo stesso fd, quindi li inserisce congiuntamente in tee. Nel primo caso, è lo STDERR del comando tee che ti uniresti al suo STDOUT.


5
È interessante notare che la pagina man di bash dice "Se |&viene utilizzato, l'errore standard di command1 è collegato all'input standard di command2 attraverso la pipe; è una scorciatoia per 2>&1 |. Questo reindirizzamento implicito dell'errore standard viene eseguito dopo qualsiasi reindirizzamento specificato dal comando."
PP.

Ho dovuto creare un piccolo programma in C che scrive sia su stderrche stdoutper capire questo problema. Gli operatori di reindirizzamento >e tee |differiscono quando si tenta di acquisire entrambi i flussi di output. Per il reindirizzamento ho dovuto ./testapp > /tmp/out.log 2>&1. Mentre per te ho dovuto farlo ./testapp 2>&1 | tee /tmp/out.log.
dattiloscritto il

@daixtr per quello che vale, |viene normalmente chiamato operatore di pipe. teesi riferisce solo al particolare programma che viene invocato all'estremità remota della pipe.
MadHatter,
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.