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


Answers:


22

使用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 / subshel​​l并由继承echo)。

或者,您可以multios完全禁用:

(setopt nomultios; echo hi 2>&1 > /dev/null | cat)

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

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

但是请注意,当关闭作业控制时(如在脚本中),该cat进程将异步运行(就像从开始&)。


3
谢谢!解决它的另一种方法是(echo hi 2>&1 1>/dev/null) | cat
塔维安·巴恩斯

1
@TavianBarnes,很好,谢谢。我已将其添加到答案中以确保完整性。它也有命令组(工程{echo...}|cat
斯特凡Chazelas
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.