นั่นคือการพึ่งพาเชลล์และไม่ใช่เอกสาร AFAICS ในkshและbashในกรณีแรกfooจะแบ่งปัน stdin barเดียวกับ echoพวกเขาจะต่อสู้เพื่อการส่งออกของ
ตัวอย่างเช่นใน
$ seq 10000 | paste - <(tr 1 X)'
1 X
2 X042
3 X043
4 X044
5 X045
[...]
คุณเห็นหลักฐานที่pasteอ่านบล็อกข้อความทุกอันจากseqเอาท์พุทของในขณะที่trอ่านอีกบล็อก
ด้วยzshมันจะได้รับ stdin ด้านนอก (เว้นแต่ว่ามันเป็นขั้วและเปลือกไม่ได้โต้ตอบในกรณีที่มันถูกเปลี่ยนเส้นทางจาก/dev/null) ksh(ซึ่งเป็นจุดกำเนิด) zshและbashเป็นเชลล์คล้ายบอร์นเดียวที่รองรับการแทนที่กระบวนการ AFAIK
ในecho "bla" | bar < <(foo)ทราบว่าbarstdin 's fooจะเป็นท่อเลี้ยงโดยการส่งออกของ นั่นเป็นพฤติกรรมที่กำหนดไว้อย่างดี ในกรณีที่ปรากฏว่าfoostdin 's เป็นท่อเลี้ยงโดยechoในทุกksh, และzshbash
หากคุณต้องการมีพฤติกรรมที่สอดคล้องกันในทั้งสามเชลล์และเป็นหลักฐานในอนาคตเนื่องจากพฤติกรรมอาจเปลี่ยนไปเนื่องจากไม่มีการบันทึกไว้ฉันจะเขียนมัน:
echo bla | { bar <(foo); }
เพื่อให้แน่ใจว่าfoostdin ยังเป็นท่อจากecho(ฉันไม่เห็นว่าทำไมคุณต้องการที่จะทำเช่นนั้น) หรือ:
echo bla | bar <(foo < /dev/null)
เพื่อให้แน่ใจว่าfooจะไม่ได้echoอ่านจากท่อจาก หรือ:
{ echo bla | bar 3<&- <(foo <&3); } 3<&0
จะมีfoo's stdin stdin zshนอกเช่นเดียวกับในรุ่นปัจจุบันของ