Jawaban:
Ini berarti blok penuh bs
ukuran itu ditambah blok tambahan dengan ukuran lebih kecil dari 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
Sunting : jawaban frostschutz menyebutkan kasus lain untuk menghasilkan blok yang tidak lengkap. Layak dibaca. Lihat juga /unix//a/17357/73443 .
0+b records out
untuk b>1
bacaan biasanya tidak lengkap saat membaca dari pipa atau sumber lain yang tidak bisa menyediakan bs=X
data dengan cukup cepat. Anda dapat memaksa dd
untuk menunggu blok data penuh menggunakan iflag=fullblock
. Opsi ini sangat berguna jika Anda juga menggunakan count=X
sebagai hitungan juga menghitung blok tidak lengkap sehingga tidak dapat diandalkan tanpa blokir penuh ...
Ada lusinan utilitas baris perintah standar yang dapat menunggu deskriptor dan menunggu input. Begitulah cara mereka semua bekerja. dd
unik karena dapat menunjukkan kepada Anda seperti apa deskriptor sekarang .
Secara pribadi, saya tidak begitu mengerti manfaat di balik GNU iflag=fullblock
opsi . Maksud saya, Anda hanya dapat cat
input Anda setidaknya dengan mudah dan tanpa harus khawatir tentang ukuran blok i / o sama sekali.
Tetapi dd
dapat mengambil bagian dari aliran - dan dapat melakukannya di read()
/ write()
batas pada sistem yang cukup modern.
{ ( 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
melakukan satu read()
blok input per. Jika file itu mencoba untuk read()
tidak memiliki data sebanyak itu telah meminta tidak peduli - yang satu read()
dianggap sebagai salah satu blok masukan. Begitulah cara kerjanya - itu adalah dd
utilitas utama.
Ketika telah melakukan tugasnya, dd
laporkan semua blok input / output yang telah ditangani. Menjalankan perintah di atas lagi, tetapi menjatuhkan stdout kali ini ...
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
Setiap kali dd
memang read(0,&in,64)
read
kembali pendek - karena file stdin deskriptor tidak memiliki cukup byte menunggu untuk memenuhi permintaannya ketika membuatnya. Dan dd
read()
0 catatan input penuh, dan 2 catatan pendek. Itulah yang dimaksud laporan itu.