Предположим, у вас есть конвейер, подобный следующему:
$ a | b
Если bостановка обработки stdin, через некоторое время канал заполняется, и запись, начиная aс его stdout, будет блокироваться (пока либо не bначнется обработка снова, либо он не умрет).
Если бы я хотел избежать этого, у меня мог бы возникнуть соблазн использовать более крупную трубу (или, проще, buffer(1)) следующим образом:
$ a | buffer | b
Это просто выиграет мне больше времени, но в конце aконцов остановится.
Что я хотел бы иметь (для очень специфического сценария, к которому я обращаюсь), так это иметь «негерметичный» канал, который при заполнении удалял бы некоторые данные (в идеале построчно) из буфера, чтобы позволить aпродолжить обработка (как вы, вероятно, можете себе представить, данные, которые передаются по конвейеру, являются расходуемыми, т. е. обработка данных bменее важна, чем aвозможность работать без блокировки).
Подводя итог, я хотел бы иметь что-то вроде ограниченного, протекающего буфера:
$ a | leakybuffer | b
Я мог бы реализовать это довольно легко на любом языке, мне просто было интересно, есть ли что-то «готовое к использованию» (или что-то вроде однострочного bash), которое мне не хватает.
Примечание: в примерах я использую обычные каналы, но вопрос в равной степени относится и к именованным каналам.
Хотя я получил ответ ниже, я также решил реализовать команду leakybuffer, поскольку простое решение, приведенное ниже, имеет некоторые ограничения: https://github.com/CAFxX/leakybuffer