คำสั่ง shell ต่อไปนี้คาดว่าจะพิมพ์บรรทัดคี่ของอินพุตสตรีมเท่านั้น:
echo -e "aaa\nbbb\nccc\nddd\n" | (while true; do head -n 1; head -n 1 >/dev/null; done)
aaa
แต่มันเป็นเพียงแค่พิมพ์บรรทัดแรก:
สิ่งเดียวกันจะไม่เกิดขึ้นเมื่อใช้กับตัวเลือก-c
( --bytes
):
echo 12345678901234567890 | (while true; do head -c 5; head -c 5 >/dev/null; done)
คำสั่งนี้ส่งออก1234512345
ตามที่คาดไว้ แต่นี้จะทำงานเฉพาะในcoreutilsการดำเนินงานของhead
ยูทิลิตี้ busybox12345
การดำเนินงานยังคงกินอักขระพิเศษเพื่อการส่งออกเป็นเพียง
ฉันเดาว่าวิธีการใช้งานเฉพาะอย่างนี้ทำเพื่อการเพิ่มประสิทธิภาพ คุณไม่สามารถรู้ได้ว่าเส้นไหนจะจบลงดังนั้นคุณจะไม่ทราบว่าต้องอ่านตัวอักษรกี่ตัว วิธีเดียวที่จะไม่ใช้อักขระพิเศษจากอินพุตสตรีมคือการอ่านสตรีมไบต์เป็นไบต์ แต่การอ่านจากสตรีมทีละหนึ่งไบต์อาจช้า ดังนั้นฉันเดาว่าhead
อ่านอินพุตสตรีมไปยังบัฟเฟอร์ใหญ่พอสมควรแล้วนับจำนวนบรรทัดในบัฟเฟอร์นั้น
ไม่สามารถพูดแบบเดียวกันสำหรับกรณีได้เมื่อใช้--bytes
ตัวเลือก ในกรณีนี้คุณรู้จำนวนไบต์ที่คุณต้องอ่าน ดังนั้นคุณอาจอ่านจำนวนไบต์นี้อย่างแน่นอนและไม่มากกว่านั้น corelibsการดำเนินการจะใช้โอกาสนี้ แต่busyboxหนึ่งไม่ก็ยังคงอ่านไบต์มากขึ้นกว่าที่จำเป็นเข้าไปในกันชน มันอาจทำเพื่อทำให้การใช้งานง่ายขึ้น
ดังนั้นคำถาม ถูกต้องหรือไม่ที่head
ยูทิลิตี้ใช้อักขระจากอินพุตสตรีมมากกว่าที่ถาม มีมาตรฐานสำหรับยูทิลิตี้ Unix บ้างไหม? และถ้ามีมันระบุพฤติกรรมนี้หรือไม่?
PS
คุณต้องกดCtrl+C
เพื่อหยุดคำสั่งด้านบน สาธารณูปโภค Unix EOF
ไม่ล้มเหลวในการอ่านเกิน หากคุณไม่ต้องการกดคุณอาจใช้คำสั่งที่ซับซ้อนมากขึ้น:
echo 12345678901234567890 | (while true; do head -c 5; head -c 5 | [ `wc -c` -eq 0 ] && break >/dev/null; done)
ซึ่งฉันไม่ได้ใช้เพื่อความเรียบง่าย