Sehen wir uns zuerst einen Beispielcode an:
#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");
}
Vergleichen wir die Ergebnisse:
./helloerror
+ Datei: keine Nachricht; Konsole: Nachricht 1,2,3;
./helloerror >error.txt
+ Datei: Nachricht 1,2; Konsole: Nachricht 3;
./helloerror 2>&1 >error.txt
+ Datei: Nachricht 1,2; Konsole: Nachricht 3;
+ wie ./helloerror> error.txt
./helloerror >error.txt 2>&1
+ Datei: Nachricht 3,1,2; Konsole: keine Nachricht;
+ beachte, dass die Reihenfolge 3 zuerst ist, dann 1, dann 2
./helloerror | tee error.txt 2>&1
+ Datei: Nachricht 1,2; Konsole: Nachricht 3,1,2;
+ beachte, dass die Reihenfolge 3 zuerst ist, dann 1, dann 2
./helloerror 2>&1 | tee error.txt
+ Datei: Nachricht 3,1,2; Konsole: Nachricht 3,1,2;
Zu verwenden:
./helloerror >error.txt 2>&1
-> wenn man alle (stdout + stderr) Nachrichten in der Datei haben möchte, aber nicht auf der Konsole gedruckt
./helloerror 2>&1 | tee error.txt
-> wenn man alle Nachrichten (stdout + stderr) in einer Datei haben und auf der Konsole ausdrucken möchte
utility 2>&1 | tee output.log
Wollen Sie mit dem Befehl " sagen, dass 1 an tee gerichtet ist, 2 auch. Da tee den Stream dupliziert, wird die Ausgabe sowohl auf der Konsole angezeigt als auch in eine Datei geschrieben? Daher der Unterschied zwischenutility 2>&1 > output.log
undutility 2>&1 | tee output.log
liegt daran,tee
dass es den Stream dupliziert. Wäre das richtig?