Представьте, что у меня есть следующая программа/скрипт ./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
команда завершилась. Это может быть, а может и не быть тем, что вам нужно.