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

Zor*_*war 9 zsh pipe io-redirection

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

echo foo >&2 | grep foo
Run Code Online (Sandbox Code Playgroud)

Zsh (5.0.2) 打印foo两次。一个似乎是标准输出,一个是标准错误,因为运行这些命令:

{ echo foo >&2 | grep foo } >/dev/null
Run Code Online (Sandbox Code Playgroud)

和:

{ echo foo >&2 | grep foo } 2>/dev/null
Run Code Online (Sandbox Code Playgroud)

两者都只打印foo一次。

cuo*_*glm 5

这就是MULTIOS的效果。

echo foo >&2 | grep foo
Run Code Online (Sandbox Code Playgroud)

将写入foostderr 并通过管道foo传输到grep. 由于 stderr 默认为终端,您将看到两foo行,一行来自echo,另一行来自grep结果。

{ echo foo >&2 | grep foo } >/dev/null
Run Code Online (Sandbox Code Playgroud)

在这里,您看到了一行,因为 stdout 被重定向到/dev/null,您只看到了foo来自echo.

{ echo foo >&2 | grep foo } 2>/dev/null
Run Code Online (Sandbox Code Playgroud)

在这里,您看到了一行,因为 stderr 被重定向到/dev/null,您只看到了foo来自grep.

您可以通过行输出颜色轻松查看终端中的差异。grep将突出显示匹配的模式(或者您可以使用 强制它--color=always)。


MULTIOS默认情况下启用nomultios选项未设置:

$ unsetopt | grep nomultios
nomultios
Run Code Online (Sandbox Code Playgroud)

要禁用它,只需设置nomultios选项:

$ setopt nomultios
Run Code Online (Sandbox Code Playgroud)