Eso depende del shell y no está documentado AFAICS. En ksh
y bash
, en el primer caso, foo
compartirá el mismo stdin que bar
. Lucharán por la salida de echo
.
Así, por ejemplo, en
$ seq 10000 | paste - <(tr 1 X)'
1 X
2 X042
3 X043
4 X044
5 X045
[...]
Usted ve evidencia que paste
lee cada dos bloques de texto de seq
la salida de mientras tr
lee los otros.
Con zsh
, obtiene el stdin externo (a menos que sea un terminal y el shell no sea interactivo, en cuyo caso se redirige /dev/null
). ksh
(donde se originó), zsh
y bash
son los únicos proyectiles tipo Bourne con soporte para la sustitución de procesos AFAIK.
En echo "bla" | bar < <(foo)
, tenga en cuenta que bar
stdin será la tubería alimentada por la salida de foo
. Ese es un comportamiento bien definido. En ese caso, parece que foo
el stdin es la tubería alimentada echo
en todos ksh
, zsh
y bash
.
Si desea tener un comportamiento constante en los tres shells y estar preparado para el futuro, ya que el comportamiento puede cambiar ya que no está documentado, lo escribiría:
echo bla | { bar <(foo); }
Para estar seguro foo
, el stdin también es el conducto de echo
(aunque no puedo ver por qué querrías hacer eso). O:
echo bla | bar <(foo < /dev/null)
Para asegurarse de foo
que no se lee desde la tubería echo
. O:
{ echo bla | bar 3<&- <(foo <&3); } 3<&0
Tener foo
el stdin el stdin externo como en las versiones actuales de zsh
.