C'est AFAICS dépendant du shell et non documenté. Dans kshet bash, dans le premier cas, foopartagera le même stdin que bar. Ils se battront pour la sortie de echo.
Ainsi, par exemple,
$ seq 10000 | paste - <(tr 1 X)'
1 X
2 X042
3 X043
4 X044
5 X045
[...]
Vous voyez des preuves qui pastelisent tous les autres blocs de texte à partir de seqla sortie de tout en trlisant les autres.
Avec zsh, il obtient le stdin externe (sauf s'il s'agit d'un terminal et que le shell n'est pas interactif auquel cas il est redirigé depuis /dev/null). ksh(d'où il provient), zshet bashsont les seuls coquilles de type Bourne avec prise en charge de la substitution de processus AFAIK.
Dans echo "bla" | bar < <(foo) , notez que c'est barstdin qui sera le tuyau alimenté par la sortie de foo. C'est un comportement bien défini. Dans ce cas, il apparaît que foostdin est le tuyau alimenté par echodans tous ksh, zshet bash.
Si vous voulez avoir un comportement cohérent entre les trois shells et être à l'épreuve du temps puisque le comportement peut changer car il n'est pas documenté, je l'écrirais:
echo bla | { bar <(foo); }
Pour être sûr que foostdin est aussi le tuyau de echo(je ne vois pas pourquoi vous voudriez faire ça cependant). Ou:
echo bla | bar <(foo < /dev/null)
Assurer foo ne pas lire le tuyau de echo. Ou:
{ echo bla | bar 3<&- <(foo <&3); } 3<&0
Avoir foo stdin le stdin externe comme dans les versions actuelles de zsh.