如何在 zsh 中仅通过管道传输 stderr?

如何在 zsh 中仅通过管道传输 stderr?

在bash中:

$ echo hi 2>&1 1>/dev/null | cat
$

在 zsh 中:

$ echo hi 2>&1 1>/dev/null | cat
hi
$

有没有办法在重定向标准输出时仅通过管道传输标准错误?

答案1

使用 zsh 和mult_ios选项打开(默认打开),位于:

echo hi 2>&1 1>/dev/null | cat

被视为 的stdout1> /dev/null | cat的多重重定向。echo

Soecho的 stdout 现在被重定向到两者/dev/null和一个管道cat(就像使用tee)。

要取消多重重定向,您可以执行以下操作:

echo hi 2>&1 >&- > /dev/null | cat

也就是说,在重定向到之前关闭标准输出(取消管道)/dev/null

或者使用命令组或子 shell,例如:

{echo hi 2>&1 1>/dev/null} | cat 
(echo hi 2>&1 1>/dev/null) | cat

这样,echo的 stdout 只会显式重定向一次(管道重定向应用于组/子 shell 并由 继承echo)。

或者您可以multios完全禁用:

(set +o multios; echo hi 2>&1 > /dev/null | cat)

或者,您可以使用流程替代而不是管道:

echo hi 2> >(cat) > /dev/null

但请注意,当作业控制关闭时(如在脚本中),该cat进程将异步运行(就像以 启动一样&)。

相关内容