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 5
que se ejecute ./generate-infinite-byte-stream
hasta 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 take
también debería redirigir la entrada estándar al programa ejecutado.
Nota: head -c 5
no 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 dd
se complete el comando. Esto puede ser o no lo que necesitas.