Risposte:
Significa blocchi interi di quella bsdimensione 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 outpoiché di b>1solito sono letture incomplete durante la lettura da una pipe o da un'altra fonte che non è in grado di fornire bs=Xdati abbastanza rapidamente. È possibile forzare ddl'attesa di blocchi completi di dati utilizzando iflag=fullblock. Questa opzione è particolarmente utile se stai usando anche count=Xcome 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=fullblockopzione GNU . Voglio dire, puoi solo catinserire i tuoi dati almeno altrettanto facilmente e senza doversi preoccupare delle dimensioni dei blocchi di I / O.
Ma ddpuò 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
ddfa 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 è ddl'utilità principale.
Quando ha fatto il suo lavoro, ddriporta 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 ddsi 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.