ตัวเลขทั้งสองหมายถึงอะไรตามลำดับในสถิติ“ a + b records” ของ dd


16

2 บรรทัดแรกในddสถิติมีรูปแบบต่อไปนี้:

a+b records in
c+d records out

ทำไมต้องเป็นตัวเลข 2 ค่า เครื่องหมายบวกนี้หมายความว่าอย่างไร ปกติa+0แล้วบางครั้งเมื่อฉันใช้ขนาดบล็อกที่ใหญ่กว่า dd ก็พิมพ์ออกมา0+b records out

คำตอบ:


16

มันหมายถึงบล็อกเต็ม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


10

0+b records outเพราะb>1มักจะอ่านไม่สมบูรณ์ในขณะที่อ่านจากไปป์หรือแหล่งอื่นที่ไม่สามารถให้bs=Xข้อมูลได้เร็วพอ คุณสามารถบังคับให้ต้องรอให้บล็อกเต็มรูปแบบของข้อมูลโดยใช้dd iflag=fullblockตัวเลือกนี้มีประโยชน์อย่างยิ่งหากคุณใช้count=Xนับเป็นนับบล็อกที่ไม่สมบูรณ์ดังนั้นจึงไม่น่าเชื่อถือหากไม่มีบล็อกเต็ม ...


4

มีโปรแกรมอรรถประโยชน์บรรทัดคำสั่งมาตรฐานมากมายที่สามารถแขวนบน 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 บันทึกย่อ นั่นคือความหมายของรายงานเหล่านั้น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.