“管道stderr,而不是stdout”在Zsh中不起作用

时间:2019-09-19 23:20:18

标签: shell zsh

How to pipe stderr, and not stdout?完美地抓住了我的问题,而第一个答案正是我最初尝试解决该问题的方式:

(echo stdout; echo 1>&2 stderr) 2>&1 >/dev/null | less

(由于使用了user1934428来演示此问题,具有回声的subshel​​l命令是一个最小的占位符;我的实际问题有一个更有用的命令,但其他人无法运行。)

但是,它不起作用:它同时显示了stdout stderr。如果我删除管道,它会按预期工作,仅显示stderr。最终,我意识到这可能是一件空壳的事情,并尝试了bash:在那儿它完美地工作了。我正在使用Zsh:Zsh会使失败吗?

2 个答案:

答案 0 :(得分:1)

这两种行为对我来说都是一样的,因为它们只显示stderr。

为了进行测试,我创建了一个输出到stdout和stderr的命令,并在Zsh和bash中相同:

(echo stdout; echo 1>&2 stderr)

打印

stdout
stderr

现在我要进行重定向:

 (echo stdout; echo 1>&2 stderr) 2>&1 >/dev/null

在这里,我看到bash zsh

stderr

但是当然写到标准输出,因为2>&1首先将命令的stderr重定向到当前标准输出,然后丢弃命令的标准输出。

答案 1 :(得分:1)

这是由于MULTIOS,当您提供多个重定向时,它会复制输出流。管道是隐式重定向。

ls >/dev/null | less中输入zsh,即使重定向了输出,您也会看到输出。这是多任务复制流。

unsetopt multios将提供所需的行为。如果我在烦恼我之前不会一直忘记它,这是一个非常方便的功能。

http://zsh.sourceforge.net/Doc/Release/Redirection.html#Multios