Das ist shellabhängig und nicht AFAICS dokumentiert. In ksh
und teilen sich bash
im ersten Fall foo
die 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, paste
die jeden anderen Textblock aus seq
der Ausgabe tr
lesen, während die anderen gelesen werden.
Mit zsh
ruft 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) zsh
und bash
sind die einzigen Bourne-ähnlichen Shells mit Unterstützung für die Prozesssubstitution AFAIK.
In zu echo "bla" | bar < <(foo)
beachten , dass bar
s stdin wird das Rohr durch den Ausgang der gespeist werden foo
. Das ist gut definiertes Verhalten. In diesem Fall scheint es so, foo
als sei stdin die Pfeife, von der echo
in all ksh
, zsh
und 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 foo
sie 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
.