C'est AFAICS dépendant du shell et non documenté. Dans ksh
et bash
, dans le premier cas, foo
partagera 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 paste
lisent tous les autres blocs de texte à partir de seq
la sortie de tout en tr
lisant 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), zsh
et bash
sont 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 bar
stdin qui sera le tuyau alimenté par la sortie de foo
. C'est un comportement bien défini. Dans ce cas, il apparaît que foo
stdin est le tuyau alimenté par echo
dans tous ksh
, zsh
et 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 foo
stdin 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
.