Припустимо, у вас є такий трубопровід:
$ a | b
Якщо b
зупиняє обробку stdin, через деякий час труба заповнюється, і запис, починаючи a
з її stdout, блокується (доки або b
знову не почне обробку, або вона вмирає).
Якби я хотів цього уникнути, я міг би спокусити використовувати більшу трубу (або, простіше кажучи, buffer(1)
) так:
$ a | buffer | b
Це просто придбало б мені більше часу, але a
врешті-решт воно зупиниться.
Що я хотів би мати (для дуже конкретного сценарію, про який я звертаюсь), це мати "протікаючу" трубу, яка, коли вона буде заповнена, викидає деякі дані (в ідеалі, по черзі) з буфера, щоб a
продовжувати продовжувати обробка (як ви, напевно, можете уявити, дані, що надходять у трубу, є витратною, тобто обробка даних, оброблених b
не менш важлива, ніж a
можливість роботи без блокування).
Підсумовуючи це, я хотів би мати щось на кшталт обмеженого, протікаючого буфера:
$ a | leakybuffer | b
Я, мабуть, міг би реалізувати це досить легко на будь-якій мові, мені було просто цікаво, чи є щось, що "готове до використання" (або щось на зразок баш-однолінійного), що мені не вистачає.
Примітка. У прикладах я використовую звичайні труби, але питання однаково стосується і названих труб
Хоча я присуджував відповідь нижче, я також вирішив застосувати команду leakybuffer, оскільки просте рішення нижче має деякі обмеження: https://github.com/CAFxX/leakybuffer