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   # ?
PP.
la source

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.

Chapelier Fou
la source
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