zsh redirecionamento de E / S: redirecionando e, em seguida, canalizando; o que está acontecendo?

7

Alguém pode explicar o que está acontecendo neste comando:

echo foo >&2 | grep foo

O Zsh (5.0.2) imprime foo duas vezes. Um aparentemente para stdout e um para stderr, já que rodando estes comandos:

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

e:

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

apenas imprima foo uma vez.

    
por Zorawar 29.06.2015 / 19:52

1 resposta

3

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
    
por 29.06.2015 / 20:19