Capture de STDERR et STDOUT dans un fichier à l'aide de tee


15

Je ne sais pas quel est le meilleur ordre pour capturer les deux STDERRet STDOUTdans le même fichier à l'aide tee. Je sais que si je veux diriger vers un fichier, je dois mapper le descripteur de fichier après la redirection, c'est-à-dire

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

Cela demande au shell d'envoyer STDOUTà /tmp/output.txtpuis d'envoyer STDERRà STDOUT(qui envoie maintenant à /tmp/output.txt).

Tenter d'effectuer l'opération 2>&1avant de rediriger le fichier n'aura pas l'effet souhaité.

Cependant, lorsque je souhaite utiliser des tuyaux, teedoit-il être:

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

Réponses:


18

Le dernier; il s'assure que STDOUT et STDERR de la commande d'origine vont au même fd, puis les alimente conjointement dans tee. Dans le premier cas, c'est le STDERR de la commande tee que vous joindriez à son STDOUT.


5
Fait intéressant, la page de manuel bash indique: "Si |&est utilisé, l'erreur standard de command1 est connectée à l'entrée standard de command2 via le canal; c'est un raccourci pour 2>&1 |. Cette redirection implicite de l'erreur standard est effectuée après toutes les redirections spécifiées par la commande."
PP.

J'ai dû créer un petit programme C qui écrit à la fois sur stderret stdoutpour comprendre ce problème. Les opérateurs de redirection >et de départ |diffèrent lors de la tentative de capture des deux flux de sortie. Pour la redirection, je devais ./testapp > /tmp/out.log 2>&1. Alors que pour le tee je devais ./testapp 2>&1 | tee /tmp/out.log.
typelogic

@daixtr pour ce qu'il vaut, le |est normalement appelé opérateur de tuyau. teefait uniquement référence au programme particulier qui est appelé à l'extrémité du tuyau.
MadHatter
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.