C'est l'effet de MULTIOS .
echo foo >&2 | grep foo
écrira foo
vers stderr et dirigera également foo
vers grep
. Parce que stderr utilise par défaut le terminal, vous verrez deux foo
lignes, une à partir echo
, une à partir du grep
ré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 foo
ligne 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 foo
ligne de grep
.
Vous pouvez facilement voir la différence dans le terminal par la couleur de sortie de la ligne. grep
mettra en surbrillance le motif correspondant (ou vous pouvez le forcer en utilisant --color=always
).
MULTIOS
a été activé par défaut avec l' nomultios
option unset:
$ unsetopt | grep nomultios
nomultios
Pour le désactiver, il suffit de définir l' nomultios
option:
$ setopt nomultios
{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.{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 commeA | grep foo
oùA
est{echo foo >&2}
. Dans ce cas,>&2
et|
ont été séparés,MULTIOS
n'a aucun effet ici.