นั่นคือการพึ่งพาเชลล์และไม่ใช่เอกสาร 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)
ทราบว่าbar
stdin 's foo
จะเป็นท่อเลี้ยงโดยการส่งออกของ นั่นเป็นพฤติกรรมที่กำหนดไว้อย่างดี ในกรณีที่ปรากฏว่าfoo
stdin 's เป็นท่อเลี้ยงโดยecho
ในทุกksh
, และzsh
bash
หากคุณต้องการมีพฤติกรรมที่สอดคล้องกันในทั้งสามเชลล์และเป็นหลักฐานในอนาคตเนื่องจากพฤติกรรมอาจเปลี่ยนไปเนื่องจากไม่มีการบันทึกไว้ฉันจะเขียนมัน:
echo bla | { bar <(foo); }
เพื่อให้แน่ใจว่าfoo
stdin ยังเป็นท่อจากecho
(ฉันไม่เห็นว่าทำไมคุณต้องการที่จะทำเช่นนั้น) หรือ:
echo bla | bar <(foo < /dev/null)
เพื่อให้แน่ใจว่าfoo
จะไม่ได้echo
อ่านจากท่อจาก หรือ:
{ echo bla | bar 3<&- <(foo <&3); } 3<&0
จะมีfoo
's stdin stdin zsh
นอกเช่นเดียวกับในรุ่นปัจจุบันของ