`unbuffer` hoặc` stdbuf` để xóa bộ đệm stdout?


13

Có sự khác biệt giữa unbuffer (1) và stdbuf (1) không? Từ những gì tôi thu thập được, unbuffer tạo ra nhiều hơn "nỗ lực tốt nhất" của việc gọi hàm libc (X) buf lúc đầu, và sau đó để mọi thứ được?

Câu trả lời:


14

Họ làm việc theo những cách hoàn toàn khác nhau.

Chương trình unbuffer sử dụng mong đợi để chạy lệnh được đặt tên. Bởi vì kỳ vọng sẽ tạo ra một giả để gắn vào thiết bị xuất chuẩn của quá trình con, nên đứa trẻ có thể bị lừa nghĩ rằng nó nên sử dụng bộ đệm dòng thay vì đệm khối. Một số chương trình sẽ thay đổi hành vi của họ khi isatty (stdout) là đúng, những chương trình khác sẽ không và rất khó để biết cái nào sẽ và cái nào sẽ không.

Chương trình stdbuf cố gắng đặt libstdbuf trước libc cho các nhị phân được tải động. Trong đó libstdbuf định nghĩa lại chiến lược đệm mặc định của các lệnh gọi libc stdio.

Tôi phát hiện ra điều này bởi

 apt-get source expect coreutils

và đọc các nguồn có liên quan cho mỗi chương trình.


Một số nội dung đáng lo ngại (từ manpage): unbuffer -pcó thể hoạt động không chính xác nếu quá trình cấp dữ liệu đầu vào cho bộ đệm không thoát. Xem xét: process1 | unbuffer -p process2 | process3Nếu process1 thoát, process2 có thể chưa kết thúc.
Unbuffer

Dường như stdbuf cũng có thể kiểm soát bộ đệm stdin của các chương trình sử dụng luồng C, điều này có vẻ quan trọng. Có lẽ điều này nên được đưa vào câu trả lời vì lợi ích của độc giả tương lai.
dan3
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.