Đó là phụ thuộc vỏ và không được ghi lại AFAICS. Trong kshvà bash, trong trường hợp đầu tiên, foosẽ chia sẻ cùng một stdin như bar. Họ sẽ chiến đấu cho đầu ra của echo.
Vì vậy, ví dụ trong,
$ seq 10000 | paste - <(tr 1 X)'
1 X
2 X042
3 X043
4 X044
5 X045
[...]
Bạn thấy bằng chứng pasteđọc mọi khối văn bản khác từ seqđầu ra trong khi trđọc các khối khác.
Với zsh, nó nhận được stdin bên ngoài (trừ khi nó là một thiết bị đầu cuối và vỏ không tương tác trong trường hợp nó được chuyển hướng từ /dev/null). ksh(nơi nó bắt nguồn) zshvà bashlà những chiếc vỏ giống như Bourne duy nhất có hỗ trợ thay thế quy trình AFAIK.
Trong echo "bla" | bar < <(foo), lưu ý rằng barstdin sẽ là đường ống được cung cấp bởi đầu ra của foo. Đó là hành vi được xác định rõ. Trong trường hợp đó, có vẻ như foostdin là đường ống được cung cấp bởi echotất cả ksh, zshvà bash.
Nếu bạn muốn có một hành vi nhất quán trên cả ba vỏ và là bằng chứng trong tương lai vì hành vi có thể thay đổi vì nó không được ghi lại, tôi sẽ viết nó:
echo bla | { bar <(foo); }
Để chắc chắn rằng foostdin cũng là đường ống từ echo(Tôi không thể hiểu tại sao bạn muốn làm điều đó). Hoặc là:
echo bla | bar <(foo < /dev/null)
Để đảm bảo fookhông không đọc từ các đường ống từ echo. Hoặc là:
{ echo bla | bar 3<&- <(foo <&3); } 3<&0
Để có foostdin của stdin bên ngoài như trong các phiên bản hiện tại của zsh.