dd
foi 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 dd
nã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
expr
bytes, substituindo ibs=
e obs=
. Se nenhuma conversão diferente de sync
, noerror
e notrunc
for 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 ibs
e obs
é definido em conjunto, como bs
então ibs
tem precedência - mas, caso contrário, se você é específico, pode obs
ou cbs
não.
Aqui está um exemplo em que ibs
é mais importante. Você pode fazer algo assim se quiser acompanhar quanto tempo a /dev/random
piscina 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 dd
vai sync
hronize 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, dd
gravarã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 dd
armazenaria 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 dd
pode 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 dd
deve fazer para fazê-lo.
E que é assim que você pode usar dd
para tubos confiável ler ou outros tipos de arquivos especiais - com apenas um pouco de matemática.
/dev/random
bloqueará 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/urandom
um valor "aleatório" menos aleatório ou verifique seu pool de entropia (em um loop e aguarde conforme necessário) ...