Dipende dalla shell e non è documentato AFAICS. In kshe bash, nel primo caso, foocondivideranno lo stesso standard bar. Combatteranno per l'output di echo.
Quindi ad esempio in,
$ seq 10000 | paste - <(tr 1 X)'
1 X
2 X042
3 X043
4 X044
5 X045
[...]
Vedi prove che pasteleggono ogni altro blocco di testo seqdall'output mentre trlegge gli altri.
Con zsh, ottiene lo stdin esterno (a meno che non sia un terminale e la shell non sia interattiva nel qual caso viene reindirizzata /dev/null). ksh(dove ha avuto origine) zshe bashsono le uniche shell tipo Bourne con supporto per la sostituzione di processo AFAIK.
In echo "bla" | bar < <(foo), nota che lo barstdin sarà la pipe alimentata dall'output di foo. È un comportamento ben definito. In tal caso, sembra che foo's stdin è il tubo alimentato da echoin tutto ksh, zshe bash.
Se vuoi avere un comportamento coerente in tutte e tre le shell ed essere a prova di futuro poiché il comportamento potrebbe cambiare in quanto non è documentato, lo scriverei:
echo bla | { bar <(foo); }
Per essere sicuri foo, lo stdin è anche la pipa di echo(non riesco a capire perché, comunque, vorresti farlo). O:
echo bla | bar <(foo < /dev/null)
Per assicurarsi fooche non legge dalla pipe da echo. O:
{ echo bla | bar 3<&- <(foo <&3); } 3<&0
Avere lo foostdin dello stdin esterno come nelle versioni attuali di zsh.