หากคุณต้องการเพียงบรรทัดแรกหรือสองบรรทัดเคล็ดลับประเภทต่อไปนี้ใช้ได้ผลและหลีกเลี่ยงปัญหาบัฟเฟอร์ที่เกิดจากการใช้สองคำสั่งต่าง ๆ ในการอ่านเอาต์พุตสตรีม:
$ ps -eF | { IFS= read -r x ; echo "$x" ; grep worker; }
$ ls -la / | { IFS= read -r x ; echo "$x" ; grep sbin; }
the read
อยู่ในตัวเชลล์และไม่ใช้บัฟเฟอร์ทั้งหมดของอินพุตเพียงแค่ส่งออกหนึ่งบรรทัดดังนั้นการใช้read
จะปล่อยให้เอาต์พุตที่เหลือทั้งหมดสำหรับคำสั่งต่อไปนี้
หากคุณต้องการเน้นปัญหาบัฟเฟอร์ที่แสดงโดยตัวอย่างของคุณที่ใช้สองคำสั่งต่างกันให้เพิ่มคำsleep
เหล่านั้นเพื่อกำจัดปัญหาเกี่ยวกับเวลาและอนุญาตให้คำสั่งทางด้านซ้ายเพื่อสร้างเอาต์พุตทั้งหมดก่อนคำสั่งทางด้านขวาพยายามอ่าน มัน:
$ ps -eF | { sleep 5 ; head -n 1 ; grep worker; }
$ ls -la / | { sleep 5 ; head -n 1 ; grep sbin; }
ตอนนี้ทั้งสองตัวอย่างข้างต้นล้มเหลวในทางเดียวกัน - The อ่านบัฟเฟอร์ทั้งหมดของการส่งออกเพียงในการผลิตหนึ่งบรรทัดและบัฟเฟอร์ที่ไม่สามารถใช้ได้ต่อไปนี้head
grep
คุณสามารถเห็นปัญหาบัฟเฟอร์ได้ชัดเจนยิ่งขึ้นโดยใช้ตัวอย่างที่กำหนดหมายเลขบรรทัดเอาต์พุตดังนั้นคุณสามารถบอกได้ว่าบรรทัดใดหายไป:
$ ps -eF | cat -n | { sleep 5 ; head -n 1 ; head ; }
$ ls -la /usr/bin | cat -n | { sleep 5 ; head -n 1 ; head ; }
วิธีง่ายๆในการดูปัญหาการบัฟเฟอร์คือการใช้seq
ที่สร้างรายการของตัวเลข เราสามารถบอกได้ว่าหมายเลขใดหายไป:
$ seq 1 100000 | { sleep 5 ; head -n 1 ; head ; }
1
1861
1862
1863
1864
1865
1866
1867
1868
1869
เคล็ดลับการแก้ปัญหาของฉันโดยใช้เชลล์เพื่ออ่านและ echo บรรทัดแรกทำงานอย่างถูกต้องแม้ว่าจะเพิ่มการหน่วงเวลาพักเครื่อง:
$ seq 1 100000 | { sleep 5 ; IFS= read -r x ; echo "$x" ; head ; }
1
2
3
4
5
6
7
8
9
10
11
ด้านล่างเป็นตัวอย่างเต็มรูปแบบที่แสดงhead
ปัญหาการบัฟเฟอร์การแสดงวิธีการ
head
ใช้บัฟเฟอร์ทั้งหมดของเอาต์พุตเพียงเพื่อสร้างห้าบรรทัดในแต่ละครั้ง บัฟเฟอร์ที่ใช้นั้นไม่สามารถใช้ได้กับhead
คำสั่งถัดไป
ในลำดับ:
$ seq 1 100000 | { sleep 5 ; head -5 ; head -5 ; head -5 ; head -5 ; }
1
2
3
4
5
1861
1862
1863
1864
499
3500
3501
3502
3503
7
5138
5139
5140
5141
จากตัวเลข1861
ด้านบนเราสามารถคำนวณขนาดของบัฟเฟอร์ที่ใช้head
โดยการนับseq
เอาต์พุตจาก1
ถึง
1860
:
$ seq 1 1860 | wc -c
8193
เราเห็นว่าhead
มีการบัฟเฟอร์โดยการอ่าน 8KB (8 * 1024 ไบต์) เต็มรูปแบบของการส่งออกท่อในเวลาแม้กระทั่งการผลิตเพียงไม่กี่บรรทัดของผลผลิตของตัวเอง
head
และgrep
ทำอะไรที่นั่น