Redirección de E / S zsh: redirección y luego canalización; ¿Que esta pasando?

8

¿Alguien puede explicar lo que está sucediendo en este comando:

echo foo >&2 | grep foo

Zsh (5.0.2) imprime foodos veces. Uno aparentemente para stdout y otro para stderr, ya que ejecuta estos comandos:

{ echo foo >&2 | grep foo } >/dev/null

y:

{ echo foo >&2 | grep foo } 2>/dev/null

ambos solo imprimen foouna vez.

Zorawar
fuente

Respuestas:

5

Ese es el efecto de MULTIOS .

echo foo >&2 | grep foo

escribirá fooen stderr y tubería fooa grep. Debido a que stderr está predeterminado en la terminal, verá dos foolíneas, una desde el echootro, desde el grepresultado.

{ echo foo >&2 | grep foo } >/dev/null

Aquí, viste una línea porque stdout fue redirigido a /dev/null, solo viste la foolínea desde echo.

{ echo foo >&2 | grep foo } 2>/dev/null

Aquí, viste una línea porque stderr fue redirigido a /dev/null, solo viste la foolínea desde grep.

Puede ver fácilmente la diferencia en el terminal por el color de salida de la línea. grepresaltará el patrón coincidente (o puede forzarlo al usarlo --color=always).


MULTIOSestaba habilitado de forma predeterminada con la nomultiosopción sin configurar:

$ unsetopt | grep nomultios
nomultios

Para deshabilitarlo, solo configure la nomultiosopción:

$ setopt nomultios
Cuonglm
fuente
¡Ah, no sabía que zsh podía hacer eso! (Básicamente) entiendo la redirección, quería saber por qué el comando no era equivalente a {echo foo >&2} | grep foo, si ves lo que estoy tratando de decir. Pensé que el comando que pregunté anteriormente habría redirigido stdout a stderr y luego canalizar stdout vacío a grep.
Zorawar
@Zorawar: Esa pregunta no fue abordada en su publicación, por lo que responderé aquí. En {echo foo >&2} | grep foo, {echo foo >&2}fue considerado como un comando, y se ejecutó en una subshell. Puedes pensarlo como A | grep foodonde Aestá {echo foo >&2}. En este caso, >&2y |fueron separados, MULTIOSno tiene ningún efecto aquí.
Cuonglm
@Zorawar Este caso es el motivo por el que terminé apagando multios. Es una idea linda, pero en la práctica me pareció a menudo molesta y rara vez útil.
Gilles 'SO- deja de ser malvado'
@cuonglm, tengo otra pregunta que se hace aquí pero no obtuve respuesta. Si lo sabes y también tienes tiempo, ¿podrías ayudarme?
Liu Sha