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 &
).