Dipende dalla shell e non è documentato AFAICS. In ksh
e bash
, nel primo caso, foo
condivideranno 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 paste
leggono ogni altro blocco di testo seq
dall'output mentre tr
legge 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) zsh
e bash
sono le uniche shell tipo Bourne con supporto per la sostituzione di processo AFAIK.
In echo "bla" | bar < <(foo)
, nota che lo bar
stdin sarà la pipe alimentata dall'output di foo
. È un comportamento ben definito. In tal caso, sembra che foo
's stdin è il tubo alimentato da echo
in tutto ksh
, zsh
e 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 foo
che non legge dalla pipe da echo
. O:
{ echo bla | bar 3<&- <(foo <&3); } 3<&0
Avere lo foo
stdin dello stdin esterno come nelle versioni attuali di zsh
.