Respostas:
Significa blocos completos desse bs
tamanho, além de blocos extras com tamanho menor que o bs.
pushd "$(mktemp -d)"
dd if=/dev/zero of=1 bs=64M count=1 # and you get a 1+0
dd if=1 of=/dev/null bs=16M # 4+0
dd if=1 of=/dev/null bs=20M # 3+1
dd if=1 of=/dev/null bs=80M # 0+1
_crap=$PWD; popd; rm -rf "$_crap"; unset _crap
# frostschutz's case
yes | dd of=/dev/null bs=64M count=1 # 0+1
Edit : a resposta de frostschutz menciona outro caso para gerar blocos não completos. Vale a pena ler. Consulte também /unix//a/17357/73443 .
0+b records out
pois b>1
geralmente são leituras incompletas durante a leitura de um canal ou outra fonte que não pode fornecer bs=X
dados com rapidez suficiente. Você pode forçar dd
a aguardar blocos completos de dados usando iflag=fullblock
. Essa opção é particularmente útil se você também estiver usando count=X
como count, também conta blocos incompletos, portanto, não é confiável sem o bloqueio completo ...
Existem dezenas de utilitários de linha de comando padrão que podem ser pendurados em um descritor e aguardar a entrada. É assim que eles funcionam. dd
é único, pois pode mostrar a aparência de um descritor agora .
Pessoalmente, eu realmente não entendo a utilidade por trás da iflag=fullblock
opção GNU . Quero dizer, você pode apenas cat
digitar sua entrada com a mesma facilidade e sem precisar se preocupar com o tamanho dos blocos de E / S.
Mas dd
pode ter um parte de um fluxo - e pode fazê-lo em read()
/ write()
limites em um sistema razoavelmente moderno.
{ ( sleep 1 #don't write() til dd is definitely setup
printf 123 #write() 3 bytes
printf %-30s\\n 456 #write() 31 bytes
printf you\ there\? #write() 10 bytes
)| dd bs=64 count=2 conv=sync| #2 64 byte read()/write() \0-padded blocks
od -vtc #show it with octal radices
} 2>/dev/null #drop stderr
0000000 1 2 3 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0
0000020 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0
0000040 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0
0000060 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0
0000100 4 5 6
0000120 \n \0
0000140 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0
0000160 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0
0000200
dd
faz um único read()
por bloco de entrada. Se o arquivo que ele tenta read()
não possui tantos dados quanto solicitados, não importa - o que read()
conta como um bloco de entrada. É assim que funciona - essa é dd
a principal utilidade.
Quando ele faz seu trabalho, dd
relatórios sobre todos os blocos de entrada / saída com os quais ele lidou. Executando o comando acima novamente, mas eliminando stdout desta vez ...
dd: warning: partial read (3 bytes); suggest iflag=fullblock
0+2 records in
2+0 records out
128 bytes (128 B) copied, 1.00161 s, 0.1 kB/s
A cada vez dd
, o tempo read(0,&in,64)
read
era curto - porque seu descritor de arquivo stdin não tinha bytes suficientes esperando que ele cumprisse sua solicitação quando o fez. E assim, dd
read()
0 registros de entrada completos e 2 curtos. É isso que esses relatórios significam.