Execute o programa até que uma quantidade específica de bytes seja retornada no stdout e, em seguida, encerre

Execute o programa até que uma quantidade específica de bytes seja retornada no stdout e, em seguida, encerre

Imagine que tenho o seguinte programa/script ./generate-infinite-byte-stream:

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

O comando de suspensão infinita representa uma conexão de rede que pode ou não fornecer mais dados em um futuro indefinido que não me interessa.

Eu gostaria de ter um programa, vamos chamá-lo take 5que seja executado ./generate-infinite-byte-streamaté ter saída de 5 bytes no stdout e então finalize-o:

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

Existe tal programa ou preciso criar o meu próprio com popen ()? O programa taketambém deve redirecionar o stdin para o programa executado.

Obs: head -c 5não faz a coisa certa, pois não finaliza:

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

Aparte: O nome Take é inspirado nohttps://reference.wolfram.com/linguagem/ref/Take.htmlcomando que retorna os primeiros n elementos de uma lista.

Responder1

Se o seu shell for Bash, você poderá usar uma substituição de processo. Demonstração:

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

Isso não mata o produtor, mas o desconecta para que o ddcomando seja concluído. Isso pode ou não ser o que você precisa.

informação relacionada