Выполнять программу до тех пор, пока на стандартный вывод не будет возвращено определенное количество байтов, затем завершить работу

Выполнять программу до тех пор, пока на стандартный вывод не будет возвращено определенное количество байтов, затем завершить работу

Представьте, что у меня есть следующая программа/скрипт ./generate-infinite-byte-stream:

#!/bin/bash
echo -n 'hello'
sleep infinity

Команда «Бесконечный сон» представляет собой сетевое соединение, которое может предоставить или не предоставить больше данных в неопределенном будущем, что меня не интересует.

Мне бы хотелось иметь программу, назовем ее так, take 5которая выполняется ./generate-infinite-byte-streamдо тех пор, пока не выведет 5 байт на стандартный вывод, а затем завершает ее:

take 5 ./generate-infinite-byte-stream
# gives 'hello' and returns with exit code 0

Есть ли такая программа или мне нужно накрутить свою с popen()? Программа takeтакже должна перенаправить stdin на исполняемую программу.

Примечание: head -c 5не делает то, что нужно, так как не завершает работу:

./generate-infinite-byte-stream | head -c 5
# this returns 'hello', but never terminates

Отступление: Название Take навеяноhttps://reference.wolfram.com/language/ref/Take.htmlкоманда, которая возвращает первые n элементов списка.

решение1

Если ваша оболочка — Bash, вы можете использовать замену процесса. Демонстрация:

dd bs=1 count=5 < <(printf hello; sleep infinity)

Это не убивает производителя, но отключает его, чтобы ddкоманда завершилась. Это может быть, а может и не быть тем, что вам нужно.

Связанный контент