Esse é o efeito de MULTIOS .
echo foo >&2 | grep foo
gravará foo para stderr e também canalizará foo para grep . Como o padrão do stderr é terminal, você verá duas foo linhas, uma de echo , uma do resultado grep .
{ echo foo >&2 | grep foo } >/dev/null
Aqui, você viu uma linha porque a stdout foi redirecionada para /dev/null , você viu apenas a linha foo de echo .
{ echo foo >&2 | grep foo } 2>/dev/null
Aqui, você viu uma linha porque stderr foi redirecionado para /dev/null , você viu apenas a linha foo de grep .
Você pode ver facilmente a diferença no terminal pela cor de saída da linha. grep destacará o padrão correspondente (ou você pode forçá-lo a usar --color=always ).
MULTIOS foi ativado por padrão com a opção nomultios não configurada:
$ unsetopt | grep nomultios
nomultios
Para desativá-lo, basta definir a opção nomultios :
$ setopt nomultios