ddfoi projetado para bloqueio - geralmente é a melhor ferramenta à sua disposição para leitura de entradas de tamanho variável, se você precisar fazer isso imediatamente, porque ddnão armazenará as leituras atuais em algum futuro write() (a menos que você a configure explicitamente dessa maneira com mais obs do que ibs) , mas fará write()tudo o que ler assim que read()for (e, opcionalmente, o processará) .
Aqui estão algumas definições importantes :
ibs=expr
- Especifique o tamanho do bloco de entrada, em bytes, por (o padrão é 512) .
expr
obs=expr
- Especifique o tamanho do bloco de saída, em bytes, por (o padrão é 512) .
expr
bs=expr
- Defina os tamanhos dos blocos de entrada e saída como
exprbytes, substituindo ibs=e obs=. Se nenhuma conversão diferente de sync, noerrore notruncfor especificada, cada bloco de entrada deve ser copiado para a saída como um único bloco sem agregar blocos curtos.
Então você vê, quando ibse obsé definido em conjunto, como bsentão ibstem precedência - mas, caso contrário, se você é específico, pode obsou cbsnão.
Aqui está um exemplo em que ibsé mais importante. Você pode fazer algo assim se quiser acompanhar quanto tempo a /dev/randompiscina enche ...
dd "ibs=$size" conv=sync "count=$lmt" \
if=/dev/random of="$somefile"
Enquanto if='s meta é legível em tudo, que vai sempre resultar no mesmo arquivo de saída de tamanho, porque ddvai synchronize blocos leia-in on nulos. Em outras palavras, se dd read()s para um bloco de entrada de $((size=10)) $((count=5))vezes e o read()arquivo retornar 2 bytes, 8 bytes, 12 bytes, 2 bytes e 4 bytes, ddgravarão em seu arquivo externo algo como
2 read bytes 8NULs \
8 read bytes 2NULs \
10 read bytes 0NULs \
4 read bytes 6NULs \
4 read bytes 6NULs
... porque dd, por padrão, não demora. Portanto, se você precisar acompanhar o fluxo e delimitar as gravações de algum outro processo, ddé a ferramenta para você.
Se você estiver gravando apenas uma quantidade de dados em um arquivo regular, ao contrário de outras declarações feitas aqui, também poderá usá dd-lo - e com bastante facilidade - mas precisará de mais de um e um fator de bloqueio confiável .
Por exemplo, se você fez:
{ dd ibs="$size" obs="${size}x$block_factor" |
dd bs="${size}x$blockfactor" "count=$lmt"
} <infile >outfile
... o primeiro ddarmazenaria em buffer quantos ibs="$size"blocos de entrada fossem necessários para preencher pelo menos um obs="${size}x$block_factor"bloco de saída para cada write()canal no tubo entre ele e o segundo dd. Isso significa que o segundo ddpode limitar a saída de forma confiável, count="$lmt"porque todos os write()s que o primeiro faz corresponderão ao seu tamanho de bloco de E / S - independentemente de quantos read()s o primeiro dddeve fazer para fazê-lo.
E que é assim que você pode usar ddpara tubos confiável ler ou outros tipos de arquivos especiais - com apenas um pouco de matemática.
/dev/randombloqueará se não houver entropia suficiente disponível para gerar o número de dígitos desejado. simplesmente leva tempo para reunir essa quantidade de "aleatoriedade" aleatória psuedo de alta qualidade ... Use/dev/urandomum valor "aleatório" menos aleatório ou verifique seu pool de entropia (em um loop e aguarde conforme necessário) ...