Ответы:
Это означает, что полные блоки этого 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 также считает неполные блоки, поэтому ненадежен без полных блоков ...
Существуют десятки стандартных утилит командной строки, которые могут зависать в дескрипторе и ждать ввода. Вот как они все работают. 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 коротких. Вот что значат эти отчеты.