有人可以解释一下这个命令中发生了什么:
echo foo >&2 | grep foo
Zsh (5.0.2) 打印foo
两次。一个似乎是标准输出,一个是标准错误,因为运行这些命令:
{ echo foo >&2 | grep foo } >/dev/null
和:
{ echo foo >&2 | grep foo } 2>/dev/null
两者都只打印foo
一次。
答案1
这就是效果多重。
echo foo >&2 | grep foo
将写入foo
stderr 并通过管道传输foo
到grep
.因为 stderr 默认为终端,所以您将看到两foo
行,一行来自echo
,一行来自结果grep
。
{ echo foo >&2 | grep foo } >/dev/null
在这里,您看到一行,因为 stdout 被重定向到/dev/null
,您只看到foo
来自 的行echo
。
{ echo foo >&2 | grep foo } 2>/dev/null
在这里,您看到一行,因为 stderr 被重定向到/dev/null
,您只看到foo
来自 的行grep
。
您可以通过线路输出颜色轻松看出终端的差异。grep
将突出显示匹配的模式(或者您可以使用 强制它--color=always
)。
MULTIOS
默认情况下启用,nomultios
但未设置选项:
$ unsetopt | grep nomultios
nomultios
要禁用它,只需设置nomultios
选项:
$ setopt nomultios