In bash:
$ echo hi 2>&1 1>/dev/null | cat
$
While in zsh:
$ echo hi 2>&1 1>/dev/null | cat
hi
$
Is there a way to pipe only standard error while redirecting standard out?
In bash:
$ echo hi 2>&1 1>/dev/null | cat
$
While in zsh:
$ echo hi 2>&1 1>/dev/null | cat
hi
$
Is there a way to pipe only standard error while redirecting standard out?
With zsh and with the mult_ios option on (on by default), in:
echo hi 2>&1 1>/dev/null | cat
The 1> /dev/null | cat is seen as a multiple redirection of echo's stdout.
So echo's stdout is now redirected to both /dev/null and a pipe to cat (as if using tee).
To cancel that multiple redirection, you can do:
echo hi 2>&1 >&- > /dev/null | cat
That is, closing stdout (cancelling the piping) before redirecting to /dev/null
Or use a command group or subshell like:
{echo hi 2>&1 1>/dev/null} | cat
(echo hi 2>&1 1>/dev/null) | cat
That way, echo's stdout is only redirected explicitly once (the pipe redirection is applied to the group/subshell and inherited by echo).
Or you can disable multios altogether:
(set +o multios; echo hi 2>&1 > /dev/null | cat)
Alternatively, you could use process substitution instead of a pipe:
echo hi 2> >(cat) > /dev/null
Beware however that when job control is off (like in scripts), the cat process will be running asynchronously (as if started with &).
(echo hi 2>&1 1>/dev/null) | cat. – Tavian Barnes Feb 23 '16 at 14:54{echo...}|cat) – Stéphane Chazelas Feb 23 '16 at 15:17