Pierwsze 2 wiersze w dd
statystykach mają następujący format:
a+b records in
c+d records out
Dlaczego 2 wartości liczbowe? Co oznacza ten znak plus? Zwykle a+0
, ale czasami kiedy używam większego rozmiaru bloku, drukuje dd0+b records out
Oznacza to pełne bloki tego bs
rozmiaru plus dodatkowe bloki o rozmiarze mniejszym niż 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
Edycja : odpowiedź frostschutz wspomina o innym przypadku generowania niepełnych bloków. Warte przeczytania. Zobacz także /unix//a/17357/73443 .
0+b records out
o b>1
zwykle niepełna odczytuje podczas odczytu rury lub innego źródła, które nie mogą zapewnić bs=X
dane wystarczająco szybko. Możesz zmusić dd
do czekania na pełne bloki danych za pomocą iflag=fullblock
. Ta opcja jest szczególnie przydatna, jeśli również używasz, count=X
ponieważ liczenie zlicza również niekompletne bloki, więc jest zawodna bez pełnego bloku ...
Istnieją dziesiątki standardowych narzędzi wiersza poleceń, które mogą zawiesić się na deskryptorze i czekać na dane wejściowe. Tak właśnie działają wszystkie. dd
jest wyjątkowy, ponieważ może pokazać, jak wygląda teraz deskryptor .
Osobiście tak naprawdę nie rozumiem przydatności iflag=fullblock
opcji GNU . Chodzi mi o to, że możesz cat
wprowadzić dane wejściowe przynajmniej tak łatwo i bez obaw o rozmiary bloków we / wy.
Ale dd
może wziąć udział strumienia - i może to zrobić w read()
/ write()
granice na rozsądnie nowoczesnego systemu.
{ ( 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
robi jeden read()
na blok wejściowy. Jeśli plik stara się read()
nie mieć jak najwięcej danych, jak zażądał to nie ma znaczenia - na jedno read()
liczy się jako jeden blok wejścia. Tak to działa - to dd
podstawowe narzędzie.
Kiedy wykona swoją pracę, dd
raporty o wszystkich blokach wejścia / wyjścia, z którymi się uporał. Ponownie uruchom powyższe polecenie, ale tym razem upuszczając standardowe wyjście ...
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
Za każdym razem dd
nie read(0,&in,64)
read
wrócił krótko - bo jego deskryptor stdin nie mają wystarczająco dużo bajtów czeka na to, aby pełnić swoją prośbę, gdy udało. I tak dd
read()
0 pełnych rekordów wejściowych i 2 krótkie. To właśnie oznaczają te raporty.