Yanıtlar:
Bu bs
boyutta 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>1
bir borudan veya bs=X
veriyi yeterince hızlı sağlayamayan başka bir kaynaktan okurken genellikle eksik okumalardır . dd
Tuşlarını kullanarak veri bloklarının tamamını beklemeye zorlayabilirsiniz iflag=fullblock
. Bu seçenek özellikle count=X
sayı 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. dd
bir tanımlayıcının şu anda nasıl göründüğünü gösterebilmesi açısından benzersizdir .
Şahsen, GNU iflag=fullblock
seçeneğinin arkasındaki faydayı gerçekten anlamıyorum . Yani, cat
girişinizi en azından kolayca ve i / o blok boyutları hakkında endişelenmenize gerek kalmadan yapabilirsiniz.
Ancak bir akışın dd
bir 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
dd
read()
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 dd
birincil 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 dd
vermedi read(0,&in,64)
read
kı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.