Це залежно від оболонок і не задокументоване AFAICS. У, kshі bash, у першому випадку, fooвони поділять той самий stdin, що і bar. Вони будуть боротися за вихід echo.
Так, наприклад,
$ seq 10000 | paste - <(tr 1 X)'
1 X
2 X042
3 X043
4 X044
5 X045
[...]
Ви бачите докази, які pasteчитають кожен інший блок тексту з результатів seq's, а trчитають інші.
З zsh, він отримує зовнішній stdin (якщо тільки це не термінал і оболонка не є інтерактивною; в цьому випадку вона перенаправлена з /dev/null). ksh(там, де він виник), zshі bashє єдиними оболонками, що нагадують Борна, з підтримкою заміщення процесів AFAIK.
В echo "bla" | bar < <(foo), зауважимо , що barSTDIN «S буде труба подається на вихідний сигнал foo. Це добре визначена поведінка. У такому випадку виявляється, що foostdin - це труба, що подається echoу всіх ksh, zshі bash.
Якщо ви хочете мати послідовну поведінку в усіх трьох оболонках і бути стійким до майбутнього, оскільки поведінка може змінюватися, оскільки це не документально підтверджено, я напишу це:
echo bla | { bar <(foo); }
Щоб бути впевненим foo, stdin - це також труба echo(я не можу зрозуміти, чому ви хочете це зробити). Або:
echo bla | bar <(foo < /dev/null)
Для того, щоб переконатися , що fooнічого НЕ читати з труби з echo. Або:
{ echo bla | bar 3<&- <(foo <&3); } 3<&0
Щоб мати foostdin зовнішній stdin, як у поточних версіях zsh.