ทำไม `echo bash | bash` ใช้ทางออกทันที?

Oct 05 2020

การดำเนินการทั้งหมดต่อไปนี้เป็นการดำเนินการที่ไม่มีผลกระทบ:

echo bash | bash
echo dash | dash
echo "bash -c bash" | bash
echo "dash -c dash" | dash

ทำไม? ตัวอย่างเช่นสำหรับบรรทัดแรกฉันคิดว่ามันจะสร้างอินสแตนซ์ bash จากนั้นมันจะสร้างอินสแตนซ์ bash อื่นที่รอการป้อนข้อมูล แต่ไม่รอการป้อนข้อมูล มันออก การทุบตีผู้ปกครองก็ออกเช่นกัน ดังนั้นอินสแตนซ์ bash ทั้งสองออกและฉันกลับมาที่อินสแตนซ์เชลล์ใด ๆ ที่ฉันเรียกใช้คำสั่งเหล่านี้ ฉันเข้าใจผิดตรงไหน?

คำตอบ

7 user414777 Oct 05 2020 at 12:45

อินสแตนซ์ทุบตีสองไม่รอสำหรับการป้อนข้อมูลบน stdin มัน (ซึ่งเป็นท่อเดียวกันbashสตริงถูกอ่านจาก) แต่มันได้รับการ EOF ทันทีที่echoกระบวนการได้ออกและปลายเขียนของท่อถูกปิด

คุณสามารถลองป้อนข้อมูลให้กับ bash ที่สองได้เช่นกัน:

(echo bash; echo echo hjello) | bash
hjello