在bash中:
$ echo hi 2>&1 1>/dev/null | cat
$
在zsh中:
$ echo hi 2>&1 1>/dev/null | cat
hi
$
在重定向标准输出时,是否可以通过管道仅发送标准错误?
在bash中:
$ echo hi 2>&1 1>/dev/null | cat
$
在zsh中:
$ echo hi 2>&1 1>/dev/null | cat
hi
$
在重定向标准输出时,是否可以通过管道仅发送标准错误?
Answers:
使用zsh并启用mult_ios
选项(默认情况下为on),位于:
echo hi 2>&1 1>/dev/null | cat
将1> /dev/null | cat
其视为对echo
stdout 的多重重定向。
因此,echo
现在将的stdout重定向到两者,/dev/null
并且将管道重定向到cat
(就像使用一样tee
)。
要取消多重重定向,您可以执行以下操作:
echo hi 2>&1 >&- > /dev/null | cat
也就是说,在重定向到之前关闭stdout(取消管道) /dev/null
或使用命令组或子shell,例如:
{echo hi 2>&1 1>/dev/null} | cat
(echo hi 2>&1 1>/dev/null) | cat
这样,echo
的stdout仅显式重定向一次(管道重定向应用于group / subshell并由继承echo
)。
或者,您可以multios
完全禁用:
(setopt nomultios; echo hi 2>&1 > /dev/null | cat)
或者,您可以使用流程替代代替管道:
echo hi 2> >(cat) > /dev/null
但是请注意,当关闭作业控制时(如在脚本中),该cat
进程将异步运行(就像从开始&
)。
{echo...}|cat
)
(echo hi 2>&1 1>/dev/null) | cat
。