Yanıtlar:
Bu bsboyutta tam bloklar ve bs'den daha küçük boyutlu ekstra bloklar anlamına gelir .
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
Düzenleme : frostschutz'un cevabı tam olmayan bloklar oluşturmak için başka bir durumdan bahsediyor. Okumaya değer. Ayrıca bkz . Https://unix.stackexchange.com/a/17357/73443 .
0+b records outçünkü b>1bir borudan veya bs=Xveriyi yeterince hızlı sağlayamayan başka bir kaynaktan okurken genellikle eksik okumalardır . ddTuşlarını kullanarak veri bloklarının tamamını beklemeye zorlayabilirsiniz iflag=fullblock. Bu seçenek özellikle count=Xsayı olarak da eksik blokları sayarsanız kullanışlıdır, bu nedenle tam blok olmadan güvenilmezdir ...
Bir tanımlayıcıya asılabilecek ve girişi bekleyebilecek düzinelerce standart komut satırı yardımcı programı vardır. Hepsi bu şekilde çalışıyor. ddbir tanımlayıcının şu anda nasıl göründüğünü gösterebilmesi açısından benzersizdir .
Şahsen, GNU iflag=fullblockseçeneğinin arkasındaki faydayı gerçekten anlamıyorum . Yani, catgirişinizi en azından kolayca ve i / o blok boyutları hakkında endişelenmenize gerek kalmadan yapabilirsiniz.
Ancak bir akışın ddbir parçasını alabilir - ve bunu makul derecede modern bir sistemde read()/ write()sınırlarında yapabilir .
{ ( 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
ddread()giriş bloğu başına bir tane yapar . O çalışırsa dosya varsa read()çok veri olarak yok o önemli değil talep ettiği gibi - bir read() sayar olarak bir girdi bloğunun. Bu şekilde çalışır - bu ddbirincil yardımcı programdır.
İşini yaptığında dd, ele aldığı tüm giriş / çıkış bloklarını rapor eder. Yukarıdaki komutu tekrar çalıştırın, ancak bu sefer stdout'u bırakın ...
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
Her seferinde ddvermedi read(0,&in,64) readkısa geri geldi - onun Stdin dosya tanımlayıcı bunu yaptığında onun isteğini yerine getirmek için yeterli bayt bekleyen yoktu çünkü. Ve böylece dd read()0 tam giriş kaydı ve 2 kısa kayıt. Bu raporların anlamı budur.