zsh I/O重定向:先重定向再管道;到底是怎么回事?

zsh I/O重定向:先重定向再管道;到底是怎么回事?

有人可以解释一下这个命令中发生了什么:

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

将写入foostderr 并通过管道传输foogrep.因为 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

相关内容