Ejecute el programa hasta que se haya devuelto una cantidad específica de bytes en la salida estándar, luego finalice

Ejecute el programa hasta que se haya devuelto una cantidad específica de bytes en la salida estándar, luego finalice

Imagine que tengo el siguiente programa/script ./generate-infinite-byte-stream:

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

El comando de suspensión infinita representa una conexión de red que puede entregar o no más datos en el futuro indefinido que no me interesan.

Me gustaría tener un programa, llamémoslo take 5que se ejecute ./generate-infinite-byte-streamhasta que genere 5 bytes en la salida estándar y luego lo finalice:

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

¿Existe tal programa o necesito crear el mío propio con popen()? El programa taketambién debería redirigir la entrada estándar al programa ejecutado.

Nota: head -c 5no hace lo correcto, porque no termina:

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

Aparte: El nombre Take está inspirado en elhttps://reference.wolfram.com/language/ref/Take.htmlcomando que devuelve los primeros n elementos de una lista.

Respuesta1

Si su shell es Bash, podría utilizar una sustitución de proceso. Manifestación:

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

Eso no mata al productor, pero lo desconecta para que ddse complete el comando. Esto puede ser o no lo que necesitas.

información relacionada