Це залежно від оболонок і не задокументоване 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)
, зауважимо , що bar
STDIN «S буде труба подається на вихідний сигнал foo
. Це добре визначена поведінка. У такому випадку виявляється, що foo
stdin - це труба, що подається 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
Щоб мати foo
stdin зовнішній stdin, як у поточних версіях zsh
.