Giả sử bạn có một đường ống như sau:
$ a | b
Nếu b
dừng xử lý stdin, sau một thời gian, đường ống sẽ đầy và ghi, từ a
thiết bị xuất chuẩn của nó, sẽ chặn (cho đến khi b
bắt đầu xử lý lại hoặc nó chết).
Nếu tôi muốn tránh điều này, tôi có thể bị cám dỗ sử dụng một đường ống lớn hơn (hoặc đơn giản hơn, buffer(1)
) như vậy:
$ a | buffer | b
Điều này chỉ đơn giản là mua cho tôi nhiều thời gian hơn, nhưng cuối a
cùng cuối cùng sẽ dừng lại.
Điều tôi muốn có (đối với một kịch bản rất cụ thể mà tôi đang giải quyết) là có một đường ống "rò rỉ", khi đầy, sẽ bỏ một số dữ liệu (lý tưởng là từng dòng một) từ bộ đệm để a
tiếp tục xử lý (như bạn có thể tưởng tượng, dữ liệu chảy trong đường ống có thể sử dụng được, tức là có dữ liệu được xử lý b
ít quan trọng hơn việc có a
thể chạy mà không bị chặn).
Tóm lại, tôi rất thích có một cái gì đó giống như một bộ đệm bị rò rỉ, bị chặn:
$ a | leakybuffer | b
Tôi có thể có thể thực hiện nó khá dễ dàng bằng bất kỳ ngôn ngữ nào, tôi chỉ tự hỏi liệu có thứ gì đó "sẵn sàng để sử dụng" (hoặc một cái gì đó giống như một bash one-liner) mà tôi đang thiếu.
Lưu ý: trong các ví dụ tôi đang sử dụng đường ống thông thường, nhưng câu hỏi cũng áp dụng tương tự cho đường ống có tên
Trong khi tôi trao giải cho câu trả lời dưới đây, tôi cũng quyết định thực hiện lệnh rò rỉ vì giải pháp đơn giản dưới đây có một số hạn chế: https://github.com/CAFxX/leakybuffer