Vediamo prima un po 'di codice di esempio:
#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");
}
Consente di confrontare i risultati:
./helloerror
+ file: nessun messaggio; console: messaggio 1,2,3;
./helloerror >error.txt
+ file: messaggio 1,2; console: messaggio 3;
./helloerror 2>&1 >error.txt
+ file: messaggio 1,2; console: messaggio 3;
+ uguale a ./helloerror> error.txt
./helloerror >error.txt 2>&1
+ file: messaggio 3,1,2; console: nessun messaggio;
+ nota che l'ordine 3 è prima, poi 1, quindi 2
./helloerror | tee error.txt 2>&1
+ file: messaggio 1,2; console: messaggio 3,1,2;
+ nota che l'ordine 3 è prima, poi 1, quindi 2
./helloerror 2>&1 | tee error.txt
+ file: messaggio 3,1,2; console: messaggio 3,1,2;
Per usare:
./helloerror >error.txt 2>&1
-> se si vogliono tutti i messaggi (stdout + stderr) nel file, ma non stampati sulla console
./helloerror 2>&1 | tee error.txt
-> se si vogliono tutti i messaggi (stdout + stderr) nel file e stampati sulla console
utility 2>&1 | tee output.log
, intendi dire che poiché 1 viene indirizzato a tee, anche 2 lo è. Poiché tee duplica il flusso, l'output viene visualizzato sia sulla console sia scritto su file? Da qui la differenza trautility 2>&1 > output.log
eutility 2>&1 | tee output.log
ètee
che duplica il flusso. Sarebbe corretto?