Załóżmy, że masz potok podobny do następującego:
$ a | b
Jeśli b
przestanie przetwarzać standardowe wejście, po pewnym czasie rura się a
zapełni i zacznie pisać, aż do b
rozpoczęcia standardowego , zostanie zablokowane (dopóki albo nie zacznie ponownie przetwarzać, albo umrze).
Gdybym chciał tego uniknąć, mogłem pokusić się o użycie większej rury (lub prościej buffer(1)
) w taki sposób:
$ a | buffer | b
To po prostu dałoby mi więcej czasu, ale w a
końcu przestałoby.
Chciałbym mieć (w bardzo konkretnym scenariuszu, do którego się odnoszę), aby mieć „nieszczelną” rurkę, która po zapełnieniu upuszczałaby niektóre dane (najlepiej wiersz po wierszu) z bufora, aby a
kontynuować przetwarzanie (jak zapewne można sobie wyobrazić, dane płynące w potoku są zbędne, tj. przetwarzanie danych b
jest mniej ważne niż a
możliwość uruchomienia bez blokowania).
Podsumowując, chciałbym mieć coś w rodzaju ograniczonego, nieszczelnego bufora:
$ a | leakybuffer | b
Prawdopodobnie mógłbym to zaimplementować dość łatwo w dowolnym języku, po prostu zastanawiałem się, czy brakuje mi czegoś „gotowego do użycia” (lub czegoś w rodzaju bash-line).
Uwaga: w przykładach używam zwykłych potoków, ale pytanie w równym stopniu dotyczy nazwanych potoków
Przyznając odpowiedź poniżej, zdecydowałem się również wdrożyć komendę leakybuffer, ponieważ poniższe proste rozwiązanie miało pewne ograniczenia: https://github.com/CAFxX/leakybuffer