จากสเป็ค :
- หาก
bs=exprดำเนินการระบุและไม่มีการแปลงอื่น ๆ กว่าsync, noerrorหรือnotruncมีการขอข้อมูลกลับมาจากบล็อกการป้อนข้อมูลแต่ละจะต้องจารึกไว้เป็นบล็อกแยกออก; หากread()ผลตอบแทนน้อยกว่าบล็อกเต็มและsyncไม่ได้ระบุการแปลงบล็อกผลลัพธ์ที่ได้จะต้องมีขนาดเท่ากับบล็อกอินพุต
ดังนั้นนี่อาจเป็นสิ่งที่ทำให้คุณสับสน ใช่เพราะddถูกออกแบบมาสำหรับการปิดกั้นโดยค่าเริ่มต้นบางส่วนread()s จะถูกแมป 1: 1 ถึงบางส่วนwrite()ของหรืออื่น ๆsyncวันที่ออกบนหาง padding NUL หรือตัวอักษรพื้นที่ในการbs=ขนาดเมื่อconv=syncมีการระบุ
ซึ่งหมายความว่าddเป็นที่ปลอดภัยที่จะใช้สำหรับการคัดลอกข้อมูล (w / ความเสี่ยงของการทุจริตไม่มีเนื่องจากการอ่านบางส่วนหรือเขียน)ในทุกกรณี แต่อย่างหนึ่งที่มันจะถูก จำกัด โดยพลการโดยcount=โต้แย้งเพราะมิฉะนั้นddจะมีความสุขwrite()ผลผลิตของตนในบล็อกขนาดเหมือนกัน สำหรับผู้ที่มีการป้อนข้อมูลread()จนกว่าจะread()ผ่านอย่างสมบูรณ์ และแม้กระทั่งข้อแม้นี้เป็นจริงเท่านั้นเมื่อbs=มีการระบุหรือobs=จะไม่ได้ระบุว่าเป็นประโยคถัดไปมากในสเป็ฯ :
- ถ้า
bs=exprตัวถูกดำเนินการไม่ได้ระบุหรือแปลงอื่น ๆ กว่าsync, noerrorหรือnotruncมีการร้องขอการป้อนข้อมูลจะถูกประมวลผลและเก็บรวบรวมลงในบล็อกเอาท์พุทขนาดเต็มจนกว่าจะสิ้นสุดของการป้อนข้อมูลที่จะถึง
หากไม่มีibs=และ / หรือมีobs=ข้อโต้แย้งสิ่งนี้ไม่สำคัญ - เพราะibsและobsมีขนาดเท่ากันตามค่าเริ่มต้น แต่คุณจะได้รับอย่างชัดเจนเกี่ยวกับการกำหนดบัฟเฟอร์อินพุตโดยการระบุขนาดที่แตกต่างกันอย่างใดอย่างหนึ่งและไม่ระบุ(เพราะมันจะมีความสำคัญ)bs=
ตัวอย่างเช่นหากคุณ:
IN| dd ibs=1| OUT
... จากนั้น POSIX ddจะมีwrite()หน่วยเป็น 512 ไบต์โดยรวบรวมทุกread()ไบต์เดี่ยว ๆลงในบล็อกเอาต์พุตเดี่ยว
มิฉะนั้นถ้าคุณทำ ...
IN| dd obs=1kx1k| OUT
ที่ ... POSIX ddจะread() ได้สูงสุด 512 ไบต์ในเวลา แต่write()ทุกเมกะไบต์ขนาดเอาท์พุทบล็อก(เคอร์เนลอนุญาตและการยกเว้นอาจจะเป็นครั้งสุดท้าย - เพราะนั่นคือ EOF)ในเต็มรูปแบบโดยการเก็บรวบรวมใส่ลงในบล็อกเอาท์พุทขนาดเต็ม
นอกจากนี้จากสเป็คแล้ว:
count=n
- คัดลอกเฉพาะบล็อกอินพุตnเท่านั้น
count=แผนที่ไปยังi?bs=บล็อกและอื่น ๆ เพื่อจัดการขีด จำกัด โดยพลการในcount=พอร์ตคุณจะต้องมีสองddตัว วิธีปฏิบัติที่เป็นไปได้มากที่สุดในการทำสองdds คือการส่งออกไปยังอินพุตของอีกอันหนึ่งซึ่งทำให้เราอยู่ในขอบเขตของการอ่าน / เขียนไฟล์พิเศษโดยไม่คำนึงถึงชนิดอินพุตต้นฉบับ
ไปป์ IPC หมายความว่าเมื่อระบุ[io]bs=args ที่จะทำอย่างปลอดภัยคุณต้องเก็บค่าดังกล่าวภายในPIPE_BUFขีด จำกัด ที่กำหนดของระบบ POSIX ระบุว่าเคอร์เนลระบบจะต้องรับประกันอะตอมread()และwrite()s ภายในขอบเขตของตามที่กำหนดในPIPE_BUF limits.hPOSIX รับประกันว่าPIPE_BUFจะเป็นอย่างน้อย ...
{_POSIX_PIPE_BUF}
- จำนวนไบต์สูงสุดที่รับประกันว่าเป็นแบบปรมาณูเมื่อเขียนไปยังไพพ์
- ค่า: 512
... (ซึ่งเกิดขึ้นเป็นค่าเริ่มต้นddบล็อก i / o)แต่ค่าจริงมักจะเป็นอย่างน้อย 4k บนระบบ Linux ที่ทันสมัยคือ 64k โดยค่าเริ่มต้น
ดังนั้นเมื่อคุณตั้งค่าโปรเซสของddคุณคุณควรทำในบล็อคแฟคเตอร์ตามค่าสามค่า:
- bs = (obs =
PIPE_BUFหรือน้อยกว่า)
- n = จำนวนไบต์ที่ต้องการอ่านทั้งหมด
- count = n / bs
ชอบ:
yes | dd obs=1k | dd bs=1k count=10k of=/dev/null
10240+0 records in
10240+0 records out
10485760 bytes (10 MB) copied, 0.1143 s, 91.7 MB/s
คุณต้องซิงโครไนซ์ i / ow / ddเพื่อจัดการอินพุตที่ไม่สามารถค้นหาได้ กล่าวอีกนัยหนึ่งทำให้ไปป์ไลน์บัฟเฟอร์อย่างชัดเจนและพวกเขาจะหยุดเป็นปัญหา นั่นคือสิ่งที่ddมีไว้เพื่อ ปริมาณที่ไม่รู้จักที่นี่คือyes's ขนาดบัฟเฟอร์ - แต่ถ้าคุณปิดกั้นออกไปเป็นที่รู้จักในปริมาณอีกddแล้วคูณมีข้อมูลเล็ก ๆ น้อย ๆ สามารถทำให้dd ปลอดภัยที่จะใช้สำหรับการคัดลอกข้อมูล (w / ความเสี่ยงของการทุจริตไม่มีเนื่องจากการอ่านบางส่วนหรือเขียน)แม้ว่าจะ จำกัด อินพุตโดยไม่ จำกัด ชนิด w / count=w / อินพุตใดก็ได้บนระบบ POSIX และไม่ขาดไบต์เดียว
นี่เป็นตัวอย่างข้อมูลจากPOSIX spec :
ibs=expr
- ระบุขนาดบล็อกใส่ไบต์โดย(ค่าปกติคือ 512)
expr
obs=expr
- ระบุขนาดของบล็อกการส่งออกในไบต์โดย(ค่าปกติคือ 512)
expr
bs=expr
- ตั้งค่าทั้งอินพุทและเอาท์พุทบล็อกขนาด
exprไบต์แทนและibs= obs=หากไม่มีการแปลงนอกเหนือจากsync, noerrorและnotruncระบุไว้แต่ละบล็อคอินพุตจะถูกคัดลอกไปยังเอาต์พุตเป็นบล็อกเดียวโดยไม่มีการรวมบล็อกสั้น ๆ
นอกจากนี้คุณยังจะได้พบกับบางนี้อธิบายที่ดีกว่าที่นี่