Esse é o efeito do MULTIOS .
echo foo >&2 | grep foo
irá escrever foo
para stderr e também canalizar foo
para grep
. Como stderr assume como padrão o terminal, você verá duas foo
linhas, uma de echo
, uma do grep
resultado.
{ echo foo >&2 | grep foo } >/dev/null
Aqui, você viu uma linha porque o stdout foi redirecionado para /dev/null
, apenas a foo
linha de echo
.
{ echo foo >&2 | grep foo } 2>/dev/null
Aqui, você viu uma linha porque o stderr foi redirecionado /dev/null
, você só viu a foo
linha 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 usando --color=always
).
MULTIOS
foi ativado por padrão com a nomultios
opção não configurada:
$ unsetopt | grep nomultios
nomultios
Para desativá-lo, basta definir a nomultios
opção:
$ setopt nomultios
{echo foo >&2} | grep foo
, se você vê o que estou tentando dizer. Eu pensei que o comando que eu perguntei acima teria redirecionado o stdout para o stderr e, em seguida, transferiu o stdout vazio para o grep.