Tentar descobrir como ter um script de shell apenas retira blocos de tamanho fixo do stdin
. Eu teria pensado que algo assim teria funcionado, mas não funciona:
#!/bin/bash
value=0
while [ "$value" != "-1" ]; do
read -r -d '' -n 20 value
if [ "$value" != "-1" ]; then
dd conv=notrunc status=none of=/path/bigfile.bin bs=1M count=1 seek=$value
fi
done
Em poucas palavras, estou tentando copiar blocos específicos de um arquivo grande para o mesmo arquivo em um local remoto. Os dados enviados do script de envio possuem um local de bloco (20 bytes) seguido por 1 MiB dos dados a serem gravados nesse local. Termina quando a localização é -1.
Eu tenho uma configuração que funciona bem se estiver executando um programa C compilado, mas gostaria de evitar isso e executar com os comandos shell nativos. O problema é que parece que não dd
consome nenhum dado, e tudo isso é tratado pelo read
comando.
Pode stdin
ser consumido por vários comandos?
Você pode ler tudo com
dd
.Isso deve funcionar (
read ... value
se tornavalue=$(dd bs=20 count=1 status=none)
):A resposta para a pergunta real é sim, você pode ler incrementalmente
stdin
quando canalizado.A solução para o problema com o script foi que o
dd
comando não estava consumindo 1 MiB de dados. Como escritodd
, leria 65516 bytes, que é 65536 (64 KiB) menos os 20 bytes para o tamanho do bloco. Depois de ler essa quantidade limitada de dados,dd
sairia. A solução é usar o sinalizadoriflag=fullblock
. Além disso, a verificação de -1 não funciona como está escrito. A solução funcional completa é: