Vamos ver um código de exemplo primeiro:
#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 comparar os resultados:
./helloerror
+ file: no message; console: mensagem 1,2,3;
./helloerror >error.txt
+ arquivo: mensagem 1,2; console: mensagem 3;
./helloerror 2>&1 >error.txt
+ arquivo: mensagem 1,2; console: mensagem 3;
+ igual a ./helloerror> error.txt
./helloerror >error.txt 2>&1
+ arquivo: mensagem 3,1,2; console: nenhuma mensagem;
+ observe que o pedido 3 é primeiro, depois 1 e 2
./helloerror | tee error.txt 2>&1
+ arquivo: mensagem 1,2; console: mensagem 3,1,2;
+ observe que o pedido 3 é primeiro, depois 1 e 2
./helloerror 2>&1 | tee error.txt
+ arquivo: mensagem 3,1,2; console: mensagem 3,1,2;
Para usar:
./helloerror >error.txt 2>&1
-> se alguém quiser todas as mensagens (stdout + stderr) no arquivo, mas não estiver no console
./helloerror 2>&1 | tee error.txt
-> se alguém quiser todas as mensagens (stdout + stderr) em arquivo e impressas no console
utility 2>&1 | tee output.log
, você quer dizer que, como 1 está sendo direcionado para tee, 2 também. Como tee duplica o fluxo, a saída é exibida no console e gravada no arquivo? Daí a diferença entreutility 2>&1 > output.log
eutility 2>&1 | tee output.log
étee
que ele duplica o fluxo.Estaria correto?