Các lệnh thường không đệm đầu vào của chúng. Họ sẽ làm một read()
khối lớn, nhưng khi đọc từ một đường ống, nếu không có nhiều byte trong đường ống, read()
cuộc gọi hệ thống sẽ trả về với càng nhiều ký tự và ứng dụng thường hoạt động với điều đó nếu có thể .
Một ngoại lệ đáng chú ý là mawk
nó sẽ tiếp tục read()
cho đến khi bộ đệm đầu vào đầy.
Các ứng dụng làm đệm đầu ra của chúng (stdout) mặc dù. Hành vi thông thường là nếu đầu ra sẽ ở mức tty, thì bộ đệm sẽ là dòng khôn ngoan (nghĩa là nó sẽ không bắt đầu ghi vào thiết bị xuất chuẩn cho đến khi nó có một dòng đầy đủ cho đầu ra hoặc toàn bộ khối cho dài dòng), trong khi đối với mọi loại tệp khác, bộ đệm là theo khối (nghĩa là nó sẽ không bắt đầu ghi cho đến khi có một khối đầy đủ để ghi (một cái gì đó như 4KiB / 8KiB ... phụ thuộc vào phần mềm và hệ thống )).
Vì vậy, trong trường hợp của bạn LongRunningCommand
có khả năng đệm đầu ra của nó theo các khối (vì đầu ra của nó là một đường ống chứ không phải là một tty), và tr
có khả năng đệm đầu ra của nó theo dòng vì đầu ra của nó có thể là đầu cuối.
Nhưng, vì bạn loại bỏ mọi ký tự dòng mới khỏi đầu ra của nó, nó sẽ không bao giờ xuất ra một dòng, do đó, bộ đệm sẽ theo khối.
Vì vậy, ở đây bạn muốn tắt bộ đệm cho cả hai LongRunningCommand
và tr
. Trên các hệ thống GNU hoặc FreeBSD:
stdbuf -o0 LongRunningCommand | stdbuf -o0 tr '\n' ,
Lưu ý rằng nếu bạn muốn nối các dòng bằng dấu phẩy, cách tiếp cận tốt hơn là sử dụng paste -sd , -
. Bằng cách đó, đầu ra sẽ bị chấm dứt bởi một ký tự dòng mới (có thể bạn vẫn sẽ cần phải tắt bộ đệm).
stdbuf
cho LongRastyCommand hoặc cho tr, hoặc cho cả hai, một cách khác nhau?