Veamos primero un código de muestra:
#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");
}
Vamos a comparar los resultados:
./helloerror
+ archivo: sin mensaje; consola: mensaje 1,2,3;
./helloerror >error.txt
+ archivo: mensaje 1,2; consola: mensaje 3;
./helloerror 2>&1 >error.txt
+ archivo: mensaje 1,2; consola: mensaje 3;
+ igual que ./helloerror> error.txt
./helloerror >error.txt 2>&1
+ archivo: mensaje 3,1,2; consola: sin mensaje;
+ tenga en cuenta que el orden 3 es primero, luego 1, luego 2
./helloerror | tee error.txt 2>&1
+ archivo: mensaje 1,2; consola: mensaje 3,1,2;
+ tenga en cuenta que el orden 3 es primero, luego 1, luego 2
./helloerror 2>&1 | tee error.txt
+ archivo: mensaje 3,1,2; consola: mensaje 3,1,2;
Para usar:
./helloerror >error.txt 2>&1
-> si uno quiere todos los mensajes (stdout + stderr) en el archivo, pero no anclado en la consola
./helloerror 2>&1 | tee error.txt
-> si uno quiere todos los mensajes (stdout + stderr) en el archivo e impresos en la consola
utility 2>&1 | tee output.log
, ¿quiere decir que dado que 1 se dirige a tee, también lo es 2. Como tee duplica la transmisión, la salida se muestra en la consola y se escribe en el archivo? De ahí la diferencia entreutility 2>&1 > output.log
yutility 2>&1 | tee output.log
estee
que duplica la transmisión. ¿Sería correcto?