ฉันไม่เคยคิดเลยจริงๆว่าเชลล์รันคำสั่ง piped อย่างไร ฉันได้รับแจ้งเสมอว่า "stdout ของโปรแกรมหนึ่งถูกส่งไปยัง stdin ของโปรแกรมอื่น" เป็นวิธีคิดเกี่ยวกับท่อ ดังนั้นโดยธรรมชาติฉันคิดว่าในกรณีที่พูดว่า A | B, A จะทำงานก่อนจากนั้น B รับ stdout ของ A และใช้ stdout ของ A เป็นอินพุต
แต่ฉันสังเกตเห็นว่าเมื่อผู้คนค้นหากระบวนการเฉพาะใน ps พวกเขาต้องการรวม grep -v "grep" ที่ท้ายคำสั่งเพื่อให้แน่ใจว่า grep ไม่ปรากฏในผลลัพธ์สุดท้าย ซึ่งหมายความว่าในคำสั่ง ps aux | grep "bash" | grep -v "grep" ซึ่งหมายความว่า ps รู้ว่า grep กำลังทำงานอยู่ดังนั้นจึงอยู่ในเอาต์พุตของ ps แต่ถ้า ps ทำงานเสร็จก่อนที่เอาต์พุตจะถูกส่งไปยัง grep มันจะรู้ได้อย่างไรว่า grep นั้นทำงานอยู่?
flamingtoast@FTOAST-UBUNTU: ~$ ps | grep ".*"
PID TTY TIME CMD
3773 pts/0 00:00:00 bash
3784 pts/0 00:00:00 ps
3785 pts/0 00:00:00 grep