Como posso canalizar apenas stderr em zsh?

12

No bash:

$ echo hi 2>&1 1>/dev/null | cat
$

Enquanto em zsh:

$ echo hi 2>&1 1>/dev/null | cat
hi
$

Existe uma maneira de enviar apenas um erro padrão ao redirecionar a saída padrão?

    
por Tavian Barnes 22.02.2016 / 17:54

1 resposta

15

Com o comando zsh e com a mult_ios option ativada (ativada por padrão), em :

echo hi 2>&1 1>/dev/null | cat

O 1> /dev/null | cat é visto como um redirecionamento múltiplo do stdout de echo .

Portanto, o stdout de echo agora é redirecionado para /dev/null e um canal para cat (como se estivesse usando tee ).

Para cancelar esse redirecionamento múltiplo, você pode fazer:

echo hi 2>&1 >&- > /dev/null | cat

Ou seja, fechando a stdout (cancelando a tubulação) antes de redirecionar para /dev/null

Ou use um grupo de comando ou subshell como:

{echo hi 2>&1 1>/dev/null} | cat 
(echo hi 2>&1 1>/dev/null) | cat

Dessa forma, o stdout de echo só é redirecionado explicitamente uma vez (o redirecionamento de pipe é aplicado ao grupo / subshell e herdado por echo ).

Ou você pode desativar multios ao mesmo tempo:

(setopt nomultios; echo hi 2>&1 > /dev/null | cat)

Como alternativa, você pode usar substituição de processo em vez de um canal:

echo hi 2> >(cat) > /dev/null
No entanto, esteja ciente de que, quando o controle de tarefa está desativado (como em scripts), o processo cat será executado de forma assíncrona (como se iniciado com & ).

    
por 22.02.2016 / 17:59