在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其视为对echostdout 的多重重定向。
因此,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。