![如何在 zsh 中仅通过管道传输 stderr?](https://linux22.com/image/84063/%E5%A6%82%E4%BD%95%E5%9C%A8%20zsh%20%E4%B8%AD%E4%BB%85%E9%80%9A%E8%BF%87%E7%AE%A1%E9%81%93%E4%BC%A0%E8%BE%93%20stderr%EF%BC%9F.png)
在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
进程将异步运行(就像以 启动一样&
)。