Das ist shellabhängig und nicht AFAICS dokumentiert. In kshund teilen sich bashim ersten Fall foodie gleichen Werte wie bar. Sie werden für die Ausgabe von kämpfen echo.
So zum Beispiel in,
$ seq 10000 | paste - <(tr 1 X)'
1 X
2 X042
3 X043
4 X044
5 X045
[...]
Sie sehen Beweise, pastedie jeden anderen Textblock aus seqder Ausgabe trlesen, während die anderen gelesen werden.
Mit zshruft es das äußere stdin ab (es sei denn, es ist ein Terminal und die Shell ist nicht interaktiv. In diesem Fall wird sie umgeleitet von /dev/null). ksh(woher es stammt) zshund bashsind die einzigen Bourne-ähnlichen Shells mit Unterstützung für die Prozesssubstitution AFAIK.
In zu echo "bla" | bar < <(foo)beachten , dass bars stdin wird das Rohr durch den Ausgang der gespeist werden foo. Das ist gut definiertes Verhalten. In diesem Fall scheint es so, fooals sei stdin die Pfeife, von der echoin all ksh, zshund gespeist wird bash.
Wenn Sie ein konsistentes Verhalten für alle drei Shells haben und zukunftssicher sein möchten, da sich das Verhalten möglicherweise ändert, da es nicht dokumentiert ist, würde ich Folgendes schreiben:
echo bla | { bar <(foo); }
Um sicher zu gehen foo, ist stdin auch die Pipe von echo(ich kann nicht verstehen, warum du das machen möchtest). Oder:
echo bla | bar <(foo < /dev/null)
Um sicherzustellen , dass foosie nicht aus dem Rohr aus lesen echo. Oder:
{ echo bla | bar 3<&- <(foo <&3); } 3<&0
Um foo's stdin das äußere stdin wie in aktuellen Versionen von zu haben zsh.