Відповіді:
Це означає повноцінні блоки такого bs
розміру, а також додаткові блоки розміром менше, ніж 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
Редагувати : у відповіді frostschutz згадується інший випадок для генерування неповних блоків. Варто прочитати. Дивіться також /unix//a/17357/73443 .
0+b records out
для, b>1
як правило, неповні зчитування під час читання з труби чи іншого джерела, які не можуть надати bs=X
дані досить швидко. Ви можете змусити dd
чекати повних блоків даних, використовуючи iflag=fullblock
. Цей параметр особливо корисний, якщо ви також використовуєте count=X
в якості count також рахує неповні блоки, так що він не є надійним без fullblock ...
Є десятки стандартних утиліт командного рядка, які можна повісити на дескриптор і чекати введення. Це майже все, що вони працюють. dd
унікальна тим, що може показати вам, як виглядає дескриптор зараз .
Особисто я не дуже розумію корисність iflag=fullblock
варіанту GNU . Я маю на увазі, ви можете просто зробити cat
своє введення принаймні так само легко і без того, щоб турбуватися про розміри блоків вводу-виводу.
Але dd
можна взяти частину потоку - і це можна зробити за read()
/ write()
межі в досить сучасній системі.
{ ( 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
робить один read()
на вхідний блок. Якщо файл намагається read()
не тільки даних , скільки він просив не має значення - на один read()
, вважається, що один блок введення. Ось як це працює - тобтоdd
головна корисність.
Коли вона виконала свою роботу, dd
звіти про всі блоки вводу / виводу, з якими вона працювала. Виконання вищевказаної команди ще раз, але замість цього разу випадання 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
Кожен раз , коли dd
ж read(0,&in,64)
read
повернувся коротко - тому що його дескриптор STDIN файл не був достатньо байт очікування для того , щоб виконати його прохання , коли він зробив це. І так dd
read()
0 повних записів та 2 коротких запису. Ось що означають ці звіти.