2 บรรทัดแรกในdd
สถิติมีรูปแบบต่อไปนี้:
a+b records in
c+d records out
ทำไมต้องเป็นตัวเลข 2 ค่า เครื่องหมายบวกนี้หมายความว่าอย่างไร ปกติa+0
แล้วบางครั้งเมื่อฉันใช้ขนาดบล็อกที่ใหญ่กว่า dd ก็พิมพ์ออกมา0+b records out
2 บรรทัดแรกในdd
สถิติมีรูปแบบต่อไปนี้:
a+b records in
c+d records out
ทำไมต้องเป็นตัวเลข 2 ค่า เครื่องหมายบวกนี้หมายความว่าอย่างไร ปกติa+0
แล้วบางครั้งเมื่อฉันใช้ขนาดบล็อกที่ใหญ่กว่า dd ก็พิมพ์ออกมา0+b records out
คำตอบ:
มันหมายถึงบล็อกเต็ม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
นับเป็นนับบล็อกที่ไม่สมบูรณ์ดังนั้นจึงไม่น่าเชื่อถือหากไม่มีบล็อกเต็ม ...
มีโปรแกรมอรรถประโยชน์บรรทัดคำสั่งมาตรฐานมากมายที่สามารถแขวนบน descriptor และรออินพุตได้ นั่นเป็นวิธีการทำงานทั้งหมด dd
มีความเป็นเอกลักษณ์ในการที่จะสามารถแสดงสิ่งที่บ่งดูเหมือนว่าในขณะนี้
โดยส่วนตัวแล้วฉันไม่เข้าใจถึงประโยชน์ของiflag=fullblock
ตัวเลือกGNU ฉันหมายความว่าคุณสามารถcat
ป้อนข้อมูลของคุณอย่างน้อยได้อย่างง่ายดายและไม่ต้องกังวลเกี่ยวกับขนาดบล็อก i / o เลย
แต่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()
ไม่ได้เป็นข้อมูลมากที่สุดเท่าที่จะได้รับการร้องขอมันไม่สำคัญ - The หนึ่ง 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 บันทึกย่อ นั่นคือความหมายของรายงานเหล่านั้น