Na festança:
$ echo hi 2>&1 1>/dev/null | cat
$
Enquanto estiver no zsh:
$ echo hi 2>&1 1>/dev/null | cat
hi
$
Existe uma maneira de canalizar apenas o erro padrão ao redirecionar a saída padrão?
Na festança:
$ echo hi 2>&1 1>/dev/null | cat
$
Enquanto estiver no zsh:
$ echo hi 2>&1 1>/dev/null | cat
hi
$
Existe uma maneira de canalizar apenas o erro padrão ao redirecionar a saída padrão?
Respostas:
Com zsh e com a mult_ios
opção 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 echo
stdout.
Portanto, echo
's stdout agora é redirecionado para ambos /dev/null
e um tubo para cat
(como se estivesse usando tee
).
Para cancelar esse redirecionamento múltiplo, você pode:
echo hi 2>&1 >&- > /dev/null | cat
Ou seja, fechando o stdout (cancelando a tubulação) antes de redirecionar para /dev/null
Ou use um grupo de comandos ou subshell como:
{echo hi 2>&1 1>/dev/null} | cat
(echo hi 2>&1 1>/dev/null) | cat
Dessa forma, echo
o stdout do s é redirecionado apenas explicitamente uma vez (o redirecionamento de canal é aplicado ao grupo / subshell e herdado por echo
).
Ou você pode desativar multios
completamente:
(setopt nomultios; echo hi 2>&1 > /dev/null | cat)
Como alternativa, você pode usar a substituição do processo em vez de um pipe:
echo hi 2> >(cat) > /dev/null
Cuidado, no entanto, quando o controle de tarefas estiver desativado (como nos scripts), o cat
processo será executado de forma assíncrona (como se iniciado &
).
{echo...}|cat
)
(echo hi 2>&1 1>/dev/null) | cat
.