Itu tergantung shell dan tidak didokumentasikan AFAICS. Di kshdan bash, dalam kasus pertama, fooakan berbagi stdin yang sama dengan bar. Mereka akan berjuang untuk hasil echo.
Jadi misalnya di,
$ seq 10000 | paste - <(tr 1 X)'
1 X
2 X042
3 X043
4 X044
5 X045
[...]
Anda melihat bukti yang pastemembaca setiap blok teks lainnya dari seqoutput sementara trmembaca yang lain.
Dengan zsh, ia mendapat stdin luar (kecuali itu terminal dan shell tidak interaktif dalam hal ini diarahkan dari /dev/null). ksh(dari mana asalnya), zshdan bashmerupakan satu-satunya cangkang mirip Bourne dengan dukungan untuk proses substitusi AFAIK.
Dalam echo "bla" | bar < <(foo), perhatikan bahwa barstdin akan menjadi pipa yang diumpankan oleh keluaran dari foo. Itu perilaku yang didefinisikan dengan baik. Dalam hal ini, tampaknya foostdin adalah pipa yang diumpankan oleh echosemua ksh, zshdan bash.
Jika Anda ingin memiliki perilaku yang konsisten di ketiga shell dan menjadi bukti di masa depan karena perilaku mungkin berubah karena tidak didokumentasikan, saya akan menulis:
echo bla | { bar <(foo); }
Yang pasti foostdin juga merupakan pipa dari echo(saya tidak bisa melihat mengapa Anda ingin melakukan itu). Atau:
echo bla | bar <(foo < /dev/null)
Untuk memastikan footidak tidak membaca dari pipa dari echo. Atau:
{ echo bla | bar 3<&- <(foo <&3); } 3<&0
Untuk memiliki foostdin stdin luar seperti dalam versi saat ini zsh.