¿Por qué no se procesa la salida estándar del primer comando en esta canalización?

¿Por qué no se procesa la salida estándar del primer comando en esta canalización?

Estoy intentando escribir un comando que pueda simultáneamente (i) leer desde la entrada estándar y (ii) leer desde una tubería. Este concepto básico funciona en zsh, pero no en bash. La siguiente sesión ilustra la diferencia de comportamiento de los dos shells:

$ echo bar > bar
$ zsh -f
zsh-5.8$ echo foo | cat < bar
foo
bar
zsh-5.8$ exit
$ bash --noprofile --norc
bash-5.0$ echo foo | cat < bar
bar

Puedo ver que los comandos anteriores proporcionan catdos fuentes de entrada estándar (la canalización y la redirección), por lo que tal vez sea ambiguo cómo se debe manejar eso. zshparece concatenar los dos flujos de entrada, con la entrada canalizada siempre primero. bashparece simplemente eliminar la entrada canalizada.

Mis preguntas son:

  1. ¿Por qué los dos caparazones se comportan de manera diferente?
  2. ¿Hay alguna manera de obligar basha comportarse como zsh?

Respuesta1

Como habrás notado, elMULTIOSopción de shellin zshes lo que hace esto posible. No hay ninguna instalación similar incorporada en el basharmazón.

En bash, obtendría el mismo comportamiento (para este ejemplo en particular; consulteEl comentario del tío Billy a continuación.) de

echo foo | { cat; cat bar; }

o

echo foo | cat - bar

Ambos lados derechos primero leen sus entradas estándar antes de leer bar.

Respuesta2

Pasé un poco más de tiempo mirando esto y descubrí que el comportamiento de zshse debe a laMULTIOSopción, que está habilitado de forma predeterminada. bashNo parece tener una opción comparable, por lo que este comportamiento es específico de zsh.

información relacionada