Jest to zależne od powłoki i nieudokumentowane AFAICS. W ksh
oraz bash
, w pierwszym przypadku, foo
będą dzielić to samo standardowe wejście bar
. Będą walczyć o produkcję echo
.
Na przykład w
$ seq 10000 | paste - <(tr 1 X)'
1 X
2 X042
3 X043
4 X044
5 X045
[...]
Widzisz dowody, które paste
czytają co drugi blok tekstu z seq
danych wyjściowych, podczas gdy tr
czytają pozostałe.
Za pomocą zsh
pobiera zewnętrzne wejście standardowe (chyba że jest to terminal, a powłoka nie jest interaktywna, w którym to przypadku jest przekierowywana /dev/null
). ksh
(skąd się wziął) zsh
i bash
są jedynymi powłokami podobnymi do Bourne'a z obsługą zastępowania procesów AFAIK.
W echo "bla" | bar < <(foo)
zauważyć, że bar
do standardowego wejścia będzie rura zasilany przez wyjście foo
. To dobrze określone zachowanie. W takim przypadku wydaje się, że foo
stdin jest rurą zasilaną przez echo
wszystkie ksh
, zsh
i bash
.
Jeśli chcesz zachować spójne zachowanie we wszystkich trzech powłokach i być przyszłościowym, ponieważ zachowanie może się zmienić, ponieważ nie jest udokumentowane, napisałbym to:
echo bla | { bar <(foo); }
Dla pewności foo
stdin jest także potokiem z echo
(nie rozumiem jednak, dlaczego chcesz to zrobić). Lub:
echo bla | bar <(foo < /dev/null)
Aby upewnić się, foo
że nie czyta z potoku z echo
. Lub:
{ echo bla | bar 3<&- <(foo <&3); } 3<&0
Aby mieć foo
standardowe wejście zewnętrzne, jak w obecnych wersjach zsh
.