Voyons d'abord un exemple de code:
#include <stdio.h>
main()
{
// message 1, on stdout (using printf)
printf("%s", "message 1, on stdout (using printf)\n");
// message 2, on stdout (using fprintf)
fprintf(stdout, "%s", "message 2, on stdout (using fprintf)\n");
// message 3, on stderr (using fprintf)
fprintf(stderr, "%s", "message 3, on stderr (using fprintf)\n");
}
Permet de comparer les résultats:
./helloerror
+ fichier: pas de message; console: message 1,2,3;
./helloerror >error.txt
+ fichier: message 1,2; console: message 3;
./helloerror 2>&1 >error.txt
+ fichier: message 1,2; console: message 3;
+ identique à ./helloerror> error.txt
./helloerror >error.txt 2>&1
+ fichier: message 3,1,2; console: pas de message;
+ notez que l'ordre 3 est le premier, puis 1, puis 2
./helloerror | tee error.txt 2>&1
+ fichier: message 1,2; console: message 3,1,2;
+ notez que l'ordre 3 est le premier, puis 1, puis 2
./helloerror 2>&1 | tee error.txt
+ fichier: message 3,1,2; console: message 3,1,2;
Pour utiliser:
./helloerror >error.txt 2>&1
-> si on veut tous les messages (stdout + stderr) dans un fichier, mais pas sur la console
./helloerror 2>&1 | tee error.txt
-> si on veut tous les messages (stdout + stderr) dans un fichier et imprimés sur la console
utility 2>&1 | tee output.log
, voulez-vous dire que, puisque 1 est dirigé vers tee, le reste est aussi 2. Puisque tee duplique le flux, le résultat est affiché à la fois sur la console et écrit dans un fichier. D'où la différence entreutility 2>&1 > output.log
etutility 2>&1 | tee output.log
esttee
en ce sens qu'il fait double emploi avec le flux serait - ce correct.?