Önce bazı örnek kodları görelim:
#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");
}
Sonuçları karşılaştıralım:
./helloerror
+ dosya: mesaj yok; konsol: mesaj 1,2,3;
./helloerror >error.txt
+ dosya: mesaj 1,2; konsol: mesaj 3;
./helloerror 2>&1 >error.txt
+ dosya: mesaj 1,2; konsol: mesaj 3;
+ ./helloerror ile aynı> error.txt
./helloerror >error.txt 2>&1
+ dosya: mesaj 3,1,2; konsol: mesaj yok;
+ 3, önce 1, sonra 2 sırasına dikkat edin
./helloerror | tee error.txt 2>&1
+ dosya: mesaj 1,2; konsol: mesaj 3,1,2;
+ 3, önce 1, sonra 2 sırasına dikkat edin
./helloerror 2>&1 | tee error.txt
+ dosya: mesaj 3,1,2; konsol: mesaj 3,1,2;
Kullanmak için:
./helloerror >error.txt 2>&1
-> biri dosyadaki tüm (stdout + stderr) mesajlarını istiyor ancak konsolda tutturulmamışsa
./helloerror 2>&1 | tee error.txt
-> biri dosyadaki tüm (stdout + stderr) mesajlarını istiyorsa ve konsolda basılıysa
utility 2>&1 | tee output.log
dosyaya yazıldığı gibi, 1 olarak beri 2 de olduğu, tee yönlendirilir ediliyor söylemek demek. Tee akışını çoğaltır yana, çıktı hem? De konsolda görüntülenir arasındaki Dolayısıyla farkutility 2>&1 > output.log
veutility 2>&1 | tee output.log
olduğunutee
o akışını çoğaltır doğru olacağını söyledi.?