จำไว้ว่าdd
เป็นอินเตอร์เฟซดิบไปread()
, write()
และlseek()
ระบบโทร คุณสามารถใช้มันได้อย่างน่าเชื่อถือเพื่อแยกส่วนของข้อมูลออกจากไฟล์ปกติอุปกรณ์บล็อกและอุปกรณ์ตัวอักษร (เช่น/dev/urandom
) ซึ่งเป็นไฟล์ที่read(buf, size)
รับประกันว่าจะส่งคืนsize
ตราบใดที่ไม่ถึงจุดสิ้นสุดของไฟล์
สำหรับท่อซ็อกเก็ตและอุปกรณ์ตัวอักษรมากที่สุด (เช่น ttys) คุณมีการรับประกันดังกล่าวไม่จนกว่าคุณจะทำread()
ของขนาด 1 หรือใช้ GNU นามสกุลdd
iflag=fullblock
ดังนั้นทั้ง:
{
gdd < file1 bs=1M iflag=fullblock count=99 skip=1
gdd < file2 bs=1M iflag=fullblock count=10
} > final_output
หรือ:
M=1048576
{
dd < file1 bs=1 count="$((99*M))" skip="$M"
dd < file2 bs=1 count="$((10*M))"
} > final_output
หรือกับกระสุนที่มี builtin รองรับผู้ใช้งานเช่นksh93
:
M=1048576
{
command /opt/ast/bin/head -c "$((99*M))" < file1 <#((M))
command /opt/ast/bin/head -c "$((10*M))" < file2
}
หรือzsh
(สมมติว่าคุณhead
สนับสนุน-c
ตัวเลือกที่นี่):
zmodload zsh/system &&
{
sysseek 1048576 && head -c 99M &&
head -c 10M < file2
} < file1 > final_output
oflag=append conv=notrunc
) ดังนั้นระบบไฟล์ที่ทำการจัดสรรล่าช้า (เช่น XFS) มีโอกาสน้อยที่สุดที่จะตัดสินใจว่าไฟล์จะถูกเขียนเมื่อยังเหลืออยู่