หยุดคำสั่งเทอร์มินัลเมื่อเอาต์พุตถึงขนาดที่กำหนดหรือไม่


1

ถ้าฉันต้องการที่จะเรียกใช้ somecommand > somefile แต่หยุดสักที somefile ถึงขนาดที่แน่นอนฉันจะทำอย่างไร

คำตอบ:


3
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


คุณเข้ามาข้างหน้าฉันในครั้งนี้!
AFH

ขอบคุณสำหรับคำตอบโดยละเอียด ฉันถือว่า "bs = 1K count = 2" ส่วนหนึ่งหมายถึง "2 อินสแตนซ์ของ 1 KiB"
Silas Reel

@SilasReel ใช่ man dd เป็นเพื่อนของคุณ. :)
Kamil Maciorowski

สิ่งนี้จะหยุดคำสั่งซอร์สหรือไม่ก็แค่ละเว้นเอาต์พุตพิเศษ (AFAIK head หลัง)
xenoid

@xenoid มันขึ้นอยู่กับ somecommand มันตอบสนองต่อท่อแตกอย่างไร ดูนี่: สิ่งที่ทำให้กระบวนการ Unix ตายด้วย Broken pipe? . ใน Debian ของฉัน head ไม่ยุติดังนั้นจึงทำให้ท่อแตก
Kamil Maciorowski
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.