Antworten:
Dies bedeutet volle Blöcke dieser bs
Größe plus zusätzliche Blöcke mit einer Größe, die kleiner als das bs ist.
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 : In der Antwort von frostschutz wird ein weiterer Fall erwähnt, bei dem nicht vollständige Blöcke generiert werden. Lesenswert. Siehe auch /unix//a/17357/73443 .
0+b records out
Denn b>1
in der Regel werden beim Lesen aus einer Pipe oder einer anderen Quelle, die nicht bs=X
schnell genug Daten liefern kann, unvollständige Lesevorgänge durchgeführt . Mit können Sie das dd
Warten auf vollständige Datenblöcke erzwingen iflag=fullblock
. Diese Option ist besonders nützlich, wenn Sie count=X
als Anzahl auch unvollständige Blöcke verwenden, sodass sie ohne vollständigen Block unzuverlässig ist.
Es gibt Dutzende von Standardbefehlszeilenprogrammen, die an einem Deskriptor hängen und auf Eingaben warten können. So arbeiten sie alle. dd
ist einzigartig, da es Ihnen zeigen kann , was sieht ein Beschreiber wie gerade jetzt .
Persönlich verstehe ich den Nutzen der GNU- iflag=fullblock
Option nicht wirklich . Ich meine, Sie können cat
Ihre Eingabe genauso einfach und ohne sich um die I / O-Blockgrößen kümmern zu müssen.
Aber dd
kann einen nehmen Teil eines Baches - und es kann es tun read()
/ write()
auf einer halbwegs modernen Systemgrenzen.
{ ( 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
Führt einen Single read()
per Input Block aus. Wenn die Datei , um es versucht , read()
nicht so viele Daten hat , wie es angefordert hat es keine Rolle, - die man read()
zählt als ein Block von Eingang. So funktioniert es - das ist dd
der Hauptnutzen.
Wenn es seine Arbeit erledigt hat, dd
meldet es alle Ein- / Ausgabeblöcke, mit denen es sich befasst hat. Führen Sie den obigen Befehl erneut aus, aber löschen Sie stattdessen stdout ...
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
Jedes Mal dd
war read(0,&in,64)
read
kam kurz zurück - weil seine stdin Dateideskriptor nicht genug Bytes hatte warten , dass es seine Anforderung zu erfüllen , wenn sie es geschafft. Also dd
read()
0 vollständige Eingabedatensätze und 2 kurze. Das ist es, was diese Berichte bedeuten.