Trước tiên hãy xem một số mã mẫu:
#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");
}
Cho phép so sánh kết quả:
./helloerror
+ tệp: không có tin nhắn; bảng điều khiển: tin nhắn 1,2,3;
./helloerror >error.txt
+ tập tin: tin nhắn 1,2; bảng điều khiển: tin nhắn 3;
./helloerror 2>&1 >error.txt
+ tập tin: tin nhắn 1,2; bảng điều khiển: tin nhắn 3;
+ giống như ./helloerror> error.txt
./helloerror >error.txt 2>&1
+ tệp: tin nhắn 3,1,2; bàn điều khiển: không có tin nhắn;
+ lưu ý thứ tự 3 là đầu tiên, sau đó 1, sau đó 2
./helloerror | tee error.txt 2>&1
+ tập tin: tin nhắn 1,2; bảng điều khiển: tin nhắn 3,1,2;
+ lưu ý thứ tự 3 là đầu tiên, sau đó 1, sau đó 2
./helloerror 2>&1 | tee error.txt
+ tệp: tin nhắn 3,1,2; bảng điều khiển: tin nhắn 3,1,2;
Để sử dụng:
./helloerror >error.txt 2>&1
-> nếu ai đó muốn tất cả các thông báo (stdout + stderr) trong tệp, nhưng không bị xóa trên bảng điều khiển
./helloerror 2>&1 | tee error.txt
-> nếu ai đó muốn tất cả các thông báo (stdout + stderr) trong tệp và được in trên bảng điều khiển
utility 2>&1 | tee output.log
, bạn có nghĩa là nói rằng vì 1 đang được chuyển hướng đến tee, 2 cũng vậy. Vì tee sao chép luồng, đầu ra được hiển thị trên bảng điều khiển cũng như được ghi vào tệp? Do đó, sự khác biệt giữautility 2>&1 > output.log
vàutility 2>&1 | tee output.log
làtee
ở chỗ nó sao chép luồng. Điều đó có đúng không?