Respuestas:
Significa bloques completos de ese bs
tamaño más bloques adicionales con un tamaño menor que el 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
Editar : la respuesta de frostschutz menciona otro caso para generar bloques no completos. Vale la pena leer. Consulte también /unix//a/17357/73443 .
0+b records out
Por b>1
lo general, son lecturas incompletas mientras se lee desde una tubería u otra fuente que no puede proporcionar bs=X
datos con la suficiente rapidez. Puede forzar dd
a esperar bloques completos de datos usando iflag=fullblock
. Esta opción es particularmente útil si también la está utilizando, count=X
ya que el recuento también cuenta los bloques incompletos, por lo que no es confiable sin el bloqueo completo ...
Hay docenas de utilidades de línea de comandos estándar que pueden colgarse en un descriptor y esperar la entrada. Así es como funcionan todos. dd
es único en el sentido de que puede mostrarle cómo se ve un descriptor en este momento .
Personalmente, realmente no entiendo la utilidad detrás de la iflag=fullblock
opción GNU . Quiero decir, puede simplemente cat
ingresar su entrada al menos con la misma facilidad y sin tener que preocuparse por el tamaño de los bloques de E / S.
Pero dd
puede tomar parte de una secuencia, y puede hacerlo en read()
/ write()
límites en un sistema razonablemente 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
hace un solo read()
por bloque de entrada. Si el archivo que intenta read()
no tiene tantos datos como ha solicitado, no importa, el que read()
cuenta como un bloque de entrada. Así es como funciona: esa es dd
la utilidad principal.
Cuando ha hecho su trabajo, dd
informa sobre todos los bloques de entrada / salida con los que se ha ocupado. Ejecutando el comando anterior nuevamente, pero esta vez soltando stdout en su lugar ...
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
Cada vez que dd
se read(0,&in,64)
read
volvió corta - debido a su descriptor de archivo de entrada estándar no tenía suficientes bytes esperando a que se cumpla su petición cuando lo hizo. Y así dd
read()
0 registros de entrada completos y 2 cortos. Eso es lo que significan esos informes.