redirection d'E / S zsh: redirection puis canalisation; que se passe-t-il?

8

Quelqu'un peut-il expliquer ce qui se passe dans cette commande:

echo foo >&2 | grep foo

Zsh (5.0.2) imprime foodeux fois. Un apparemment à stdout et un à stderr, depuis l'exécution de ces commandes:

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

et:

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

les deux n'impriment fooqu'une seule fois.

Zorawar
la source

Réponses:

5

C'est l'effet de MULTIOS .

echo foo >&2 | grep foo

écrira foovers stderr et dirigera également foovers grep. Parce que stderr utilise par défaut le terminal, vous verrez deux foolignes, une à partir echo, une à partir du greprésultat.

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

Ici, vous avez vu une ligne car stdout a été redirigé vers /dev/null, vous n'avez vu que la fooligne de echo.

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

Ici, vous avez vu une ligne parce que stderr a été redirigé vers /dev/null, vous n'avez vu que la fooligne de grep.

Vous pouvez facilement voir la différence dans le terminal par la couleur de sortie de la ligne. grepmettra en surbrillance le motif correspondant (ou vous pouvez le forcer en utilisant --color=always).


MULTIOSa été activé par défaut avec l' nomultiosoption unset:

$ unsetopt | grep nomultios
nomultios

Pour le désactiver, il suffit de définir l' nomultiosoption:

$ setopt nomultios
cuonglm
la source
Ah, je ne savais pas que zsh pouvait faire ça! Je comprends (essentiellement) la redirection, je voulais savoir pourquoi la commande n'était pas équivalente {echo foo >&2} | grep foo, si vous voyez ce que j'essaie de dire. Je pensais que la commande que j'ai demandée ci-dessus aurait redirigé stdout vers stderr, puis dirigé stdout vide vers grep.
Zorawar
@Zorawar: Cette question n'a pas été abordée dans votre message, je vais donc répondre ici. In {echo foo >&2} | grep foo, {echo foo >&2}était considéré comme une commande et s'exécutait en sous-couche. Vous pouvez le penser comme A | grep fooAest {echo foo >&2}. Dans ce cas, >&2et |ont été séparés, MULTIOSn'a aucun effet ici.
cuonglm
@Zorawar Ce cas est la raison pour laquelle j'ai fini par désactiver les multios. C'est une idée mignonne, mais dans la pratique, je la trouvais souvent ennuyeuse et rarement utile.
Gilles 'SO- arrête d'être méchant'
@cuonglm, j'ai une autre question qui est posée ici mais je n'ai pas eu de réponse. Si vous le savez et que vous avez aussi le temps, pourriez-vous s'il vous plaît aider?
Liu Sha