Itu tergantung shell dan tidak didokumentasikan AFAICS. Di ksh
dan bash
, dalam kasus pertama, foo
akan 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 paste
membaca setiap blok teks lainnya dari seq
output sementara tr
membaca 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), zsh
dan bash
merupakan satu-satunya cangkang mirip Bourne dengan dukungan untuk proses substitusi AFAIK.
Dalam echo "bla" | bar < <(foo)
, perhatikan bahwa bar
stdin akan menjadi pipa yang diumpankan oleh keluaran dari foo
. Itu perilaku yang didefinisikan dengan baik. Dalam hal ini, tampaknya foo
stdin adalah pipa yang diumpankan oleh echo
semua ksh
, zsh
dan 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 foo
stdin juga merupakan pipa dari echo
(saya tidak bisa melihat mengapa Anda ingin melakukan itu). Atau:
echo bla | bar <(foo < /dev/null)
Untuk memastikan foo
tidak tidak membaca dari pipa dari echo
. Atau:
{ echo bla | bar 3<&- <(foo <&3); } 3<&0
Untuk memiliki foo
stdin stdin luar seperti dalam versi saat ini zsh
.