ถ้าฉันต้องการที่จะเรียกใช้ somecommand > somefile
แต่หยุดสักที somefile
ถึงขนาดที่แน่นอนฉันจะทำอย่างไร
ถ้าฉันต้องการที่จะเรียกใช้ somecommand > somefile
แต่หยุดสักที somefile
ถึงขนาดที่แน่นอนฉันจะทำอย่างไร
คำตอบ:
somecommand | dd bs=1K count=2 iflag=fullblock > somefile
นี้จะเขียนตรง 2 KiB ไปยังไฟล์ (น้อยกว่าถ้า somecommand
สิ้นสุดก่อน) iflag=fullblock
POSIX ไม่ต้องการของคุณ dd
อาจไม่สนับสนุนคำสั่งที่มี iflag=fullblock
ไม่พกพา เปรียบเทียบ สถานการณ์นี้ เพื่อดูว่าทำไมมันถึงมีความสำคัญ
หลังจากประมวลผลจำนวนบล็อกที่ถูกต้อง ( count=2
ในตัวอย่างข้างต้น) dd
สิ้นสุดซึ่งจะทำลายท่อ มันขึ้นอยู่กับ somecommand
มันตอบสนองต่อท่อแตกอย่างไร ดูนี่: สิ่งที่ทำให้กระบวนการ Unix ตายด้วยท่อแตก
หากจำนวนไบต์ที่คุณต้องการให้บังคับให้คุณใช้ไม่สะดวก bs
และ / หรือ count
, พิจารณาสิ่งนี้:
somecommand | { dd bs=1M count=1024 iflag=fullblock; dd bs=10 count=1 iflag=fullblock; } > somefile
คำสั่งจะเขียน 1 GiB (= 1024 MiB) บวก 10 ไบต์
การใช้งานบางอย่างของ head
อนุญาตให้คุณใช้ -c
ตัวเลือกเพื่อรับจำนวนไบต์โดยพลการ นี่ไม่ใช่แบบพกพาตัวเลือกไม่จำเป็นต้องใช้โดย POSIX
ตามที่ คำตอบนี้ dd
ด้วยขนาดบล็อกอินพุต 1 ( ibs=1
) เป็นวิธี POSIX เพียงวิธีเดียวในการอ่านจำนวนไบต์ที่แน่นอน
ถ้า somecommand
สร้างเอาต์พุตแบบข้อความและคุณต้องการ จำกัด จำนวนบรรทัดในไฟล์ head
เป็นเครื่องมือที่เหมาะสม สิ่งนี้จะบันทึก 5 บรรทัดแรกเท่านั้น (อีกครั้งน้อยลงถ้า somecommand
สิ้นสุดก่อน):
somecommand | head -n 5 > somefile
-n
ตัวเลือกของ head
เป็นสิ่งจำเป็นโดย POSIX
man dd
เป็นเพื่อนของคุณ. :)
head
หลัง)
somecommand
มันตอบสนองต่อท่อแตกอย่างไร ดูนี่: สิ่งที่ทำให้กระบวนการ Unix ตายด้วย Broken pipe? . ใน Debian ของฉัน head
ไม่ยุติดังนั้นจึงทำให้ท่อแตก