Risposte:
Significa blocchi interi di quella bs
dimensione più blocchi extra con dimensioni inferiori alla 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
Modifica : la risposta di frostschutz menziona un altro caso per generare blocchi non completi. Vale la pena leggere. Vedi anche /unix//a/17357/73443 .
0+b records out
poiché di b>1
solito sono letture incomplete durante la lettura da una pipe o da un'altra fonte che non è in grado di fornire bs=X
dati abbastanza rapidamente. È possibile forzare dd
l'attesa di blocchi completi di dati utilizzando iflag=fullblock
. Questa opzione è particolarmente utile se stai usando anche count=X
come count conta anche i blocchi incompleti quindi non è affidabile senza fullblock ...
Esistono dozzine di utility standard da riga di comando che possono essere bloccate su un descrittore e attendere l'input. È praticamente come funzionano tutti. dd
è unico in quanto può mostrarti come appare un descrittore in questo momento .
Personalmente, non capisco davvero l'utilità dietro l' iflag=fullblock
opzione GNU . Voglio dire, puoi solo cat
inserire i tuoi dati almeno altrettanto facilmente e senza doversi preoccupare delle dimensioni dei blocchi di I / O.
Ma dd
può prendere parte di un flusso - e può farlo a read()
/ write()
confini su un sistema ragionevolmente 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
fa un singolo read()
per blocco di input. Se il file che tenta di read()
non avere tutti i dati richiesti non ha importanza: quello read()
conta come un blocco di input. Funziona così: questa è dd
l'utilità principale.
Quando ha fatto il suo lavoro, dd
riporta tutti i blocchi di input / output che ha affrontato. Eseguendo nuovamente il comando sopra, ma stdout invece stavolta ...
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
Ogni volta che dd
si read(0,&in,64)
read
è tornato a breve - perché il suo descrittore di file stdin non ha avuto abbastanza byte in attesa di adempiere la sua richiesta, quando ha fatto. E così dd
read()
0 record di input completi e 2 brevi. Questo è ciò che significano quei rapporti.