การดู "ท่อแตก" ในสถานการณ์เช่นนี้หายาก แต่ปกติ
เมื่อคุณรันtype rvm | head -1
bash จะทำงานtype rvm
ในกระบวนการหนึ่งในอีกกระบวนการhead -1
หนึ่ง 1 stdout ของtype
การเชื่อมต่อกับ "การเขียน" ปลายท่อ , stdin ของhead
ที่ "อ่าน" สิ้น กระบวนการทั้งสองทำงานในเวลาเดียวกัน
head -1
กระบวนการอ่านข้อมูลจาก stdin (โดยปกติในชิ้น 8 KB), ที่พิมพ์ออกมาเป็นเส้นเดียว (ตาม-1
ตัวเลือก) และทางออกที่ก่อให้เกิด "อ่าน" ปลายท่อที่จะปิด เนื่องจากrvm
ฟังก์ชั่นค่อนข้างยาว (ประมาณ 11 kB หลังจากถูกแยกวิเคราะห์และสร้างใหม่โดยการทุบตี) ซึ่งหมายความว่าhead
จะออกในขณะที่type
ยังคงมีข้อมูลไม่กี่กิโลไบต์ที่จะเขียนออกมา
ณ จุดนี้เนื่องจากtype
พยายามเขียนไปยังไพพ์ที่ปลายอีกด้านหนึ่งถูกปิด - ไพพ์ที่ขาด - ฟังก์ชั่น write () ที่ caled จะส่งคืนข้อผิดพลาด EPIPE ซึ่งแปลว่า "ไพพ์ไพพ์" นอกเหนือจากข้อผิดพลาดนี้เคอร์เนลยังส่งสัญญาณ SIGPIPE ไปให้type
ซึ่งโดยค่าเริ่มต้นจะฆ่ากระบวนการทันที
(สัญญาณมีประโยชน์อย่างมากในเชลล์เชิงโต้ตอบเนื่องจากผู้ใช้ส่วนใหญ่ไม่ต้องการให้กระบวนการแรกทำงานต่อไปและพยายามเขียนถึงที่ใด ๆ ในขณะเดียวกันบริการที่ไม่โต้ตอบไม่สนใจ SIGPIPE - มันจะไม่ดีสำหรับ daemon ที่ทำงานมายาวนาน ตายบนข้อผิดพลาดง่าย ๆ - พวกเขาพบว่ารหัสข้อผิดพลาดมีประโยชน์มาก)
อย่างไรก็ตามการส่งสัญญาณไม่ได้ 100% ทันทีและอาจมีบางกรณีที่ write () ส่งคืน EPIPE และกระบวนการยังคงทำงานต่อไปชั่วครู่ก่อนที่จะรับสัญญาณ ในกรณีนี้ให้type
มีเวลามากพอที่จะสังเกตเห็นว่าการเขียนล้มเหลวแปลรหัสข้อผิดพลาดและแม้แต่พิมพ์ข้อความแสดงข้อผิดพลาดไปยัง stderr ก่อนที่ SIGPIPE จะถูกฆ่า (ข้อความแสดงข้อผิดพลาดแจ้งว่า "-bash: type:" เนื่องจากtype
เป็นคำสั่งในตัวของ bash เอง)
สิ่งนี้ดูเหมือนว่าจะพบได้บ่อยในระบบหลายซีพียูเนื่องจากtype
กระบวนการและรหัสการส่งสัญญาณของเคอร์เนลสามารถทำงานบนแกนที่แตกต่างกันในเวลาเดียวกัน
เป็นไปได้ที่จะลบข้อความนี้โดยการติดตั้งtype
builtin (ในซอร์สโค้ดของ bash) เพื่อออกทันทีเมื่อได้รับ EPIPE จากฟังก์ชัน write ()
อย่างไรก็ตามไม่มีอะไรที่ต้องกังวลและไม่เกี่ยวข้องกับการrvm
ติดตั้งของคุณแต่อย่างใด