Possível erro de redirecionamento em zsh 5x

3

[O título deste post precisa de algum trabalho; sugestões de boas-vindas.]

O seguinte comando produz saídas diferentes no zsh v. 4.xe 5.x:

{
  (
    printf "X\nY\n"
    printf "WARNING: foo\nWARNING: bar\n" >&2
    printf "1\n2\n"
  ) 2>&1 >&3 | grep -v foo >&2
} 3>&1

(Este código deve ilustrar como suprimir seletivamente parte da saída enviada ao stderr por um programa; nesse caso, o aviso foo está sendo suprimido seletivamente, enquanto o aviso bar pode passar por ; observe que, no final, stderr e stdout streams permanecem separados.)

Em v 4.x, a saída que vejo no terminal é a desejada / esperada:

X
Y
1
2
WARNING: bar

(Você pode ver uma ordenação diferente da linha WARNING: bar em relação aos outros.)

No v 5.0.7 (Debian) e 5.1.1 (Darwin), no entanto, o que eu vejo no terminal é este:

X
Y
1
2
WARNING: bar
X
Y
1
2

IOW, as linhas que devem ser enviadas para stdout aparecem duas vezes.

Eu acho que existem três possibilidades:

  1. este é um bug no v. 5.x (nesse caso, minha pergunta é: existe uma solução alternativa?)
  2. Eu não configurei corretamente meu v. 5.x zsh (nesse caso, minha pergunta é: como devo configurar meu v. 5.x zsh para obter o comportamento desejado?);
  3. há um bug no v. 4.x, mas não no v. 5.x, que mascarou um bug no meu código (nesse caso, minha pergunta é: como eu poderia consertar meu código para obter o comportamento desejado em v 5.x?)
por kjo 05.03.2016 / 20:28

1 resposta

2

Na verdade, o bug estava no 4.0 e foi corrigido.

O que você está vendo é o efeito das opções multios , específicas para zsh . Se você quiser ver o mesmo comportamento que em outros shells, será necessário desativar essa opção setopt nomultios ou chamar zsh as sh .

Com multios , em cmd1 >&3 | cmd2 , você está redirecionando o stdout de cmd1 para &3 e o canal para cmd2 . Veja Como posso canalizar apenas stderr em zsh? para mais detalhes.

    
por 06.03.2016 / 19:51