$ program [arguments...] 2>&1 | tee outfile
2>&1
đổ các dòng stderr và stdout.
tee outfile
lấy luồng nó nhận và ghi nó vào màn hình và vào tệp "outfile".
Đây có lẽ là điều mà hầu hết mọi người đang tìm kiếm. Tình huống có thể là một số chương trình hoặc kịch bản đang làm việc chăm chỉ trong một thời gian dài và tạo ra rất nhiều đầu ra. Người dùng muốn kiểm tra định kỳ để biết tiến trình, nhưng cũng muốn đầu ra được ghi vào một tệp.
Vấn đề (đặc biệt là khi trộn các luồng stdout và stderr) là có sự phụ thuộc vào các luồng được chương trình tuôn ra. Ví dụ, nếu tất cả các ghi vào thiết bị xuất chuẩn không bị xóa , nhưng tất cả các ghi vào stderr đều bị xóa , thì chúng sẽ kết thúc theo thứ tự thời gian trong tệp đầu ra và trên màn hình.
Cũng thật tệ nếu chương trình chỉ xuất 1 hoặc 2 dòng cứ sau vài phút để báo cáo tiến trình. Trong trường hợp như vậy, nếu chương trình không được chương trình tuôn ra, người dùng thậm chí sẽ không thấy bất kỳ đầu ra nào trên màn hình trong nhiều giờ, bởi vì không ai trong số đó sẽ bị đẩy qua đường ống trong nhiều giờ.
Cập nhật: Chương trình unbuffer
, một phần của expect
gói, sẽ giải quyết vấn đề đệm. Điều này sẽ khiến thiết bị xuất chuẩn và thiết bị xuất chuẩn ghi vào màn hình và tập tin ngay lập tức và giữ chúng đồng bộ khi được kết hợp và chuyển hướng đến tee
. Ví dụ:
$ unbuffer program [arguments...] 2>&1 | tee outfile