How to pipe stderr, and not stdout?完美地抓住了我的问题,而第一个答案正是我最初尝试解决该问题的方式:
(echo stdout; echo 1>&2 stderr) 2>&1 >/dev/null | less
(由于使用了user1934428来演示此问题,具有回声的subshell命令是一个最小的占位符;我的实际问题有一个更有用的命令,但其他人无法运行。)
但是,它不起作用:它同时显示了stdout 和 stderr。如果我删除管道,它会按预期工作,仅显示stderr。最终,我意识到这可能是一件空壳的事情,并尝试了bash:在那儿它完美地工作了。我正在使用Zsh:Zsh会使失败吗?
答案 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