Eso depende del shell y no está documentado AFAICS. En kshy bash, en el primer caso, foocompartirá el mismo stdin que bar. Lucharán por la salida de echo.
Así, por ejemplo, en
$ seq 10000 | paste - <(tr 1 X)'
1 X
2 X042
3 X043
4 X044
5 X045
[...]
Usted ve evidencia que pastelee cada dos bloques de texto de seqla salida de mientras trlee los otros.
Con zsh, obtiene el stdin externo (a menos que sea un terminal y el shell no sea interactivo, en cuyo caso se redirige /dev/null). ksh(donde se originó), zshy bashson los únicos proyectiles tipo Bourne con soporte para la sustitución de procesos AFAIK.
En echo "bla" | bar < <(foo), tenga en cuenta que barstdin será la tubería alimentada por la salida de foo. Ese es un comportamiento bien definido. En ese caso, parece que fooel stdin es la tubería alimentada echoen todos ksh, zshy bash.
Si desea tener un comportamiento constante en los tres shells y estar preparado para el futuro, ya que el comportamiento puede cambiar ya que no está documentado, lo escribiría:
echo bla | { bar <(foo); }
Para estar seguro foo, el stdin también es el conducto de echo(aunque no puedo ver por qué querrías hacer eso). O:
echo bla | bar <(foo < /dev/null)
Para asegurarse de fooque no se lee desde la tubería echo. O:
{ echo bla | bar 3<&- <(foo <&3); } 3<&0
Tener fooel stdin el stdin externo como en las versiones actuales de zsh.