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 5
que seja executado ./generate-infinite-byte-stream
até 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 take
também deve redirecionar o stdin para o programa executado.
Obs: head -c 5
nã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 dd
comando seja concluído. Isso pode ou não ser o que você precisa.