Answers:
那就是MULTIOS的效果。
echo foo >&2 | grep foo
将写入foostderr并通过管道foo传输到grep。由于stderr默认为terminal,因此您将看到两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
{echo foo >&2} | grep foo,{echo foo >&2}被视为命令,它在子shell中运行。你可以认为它像A | grep foo哪里A是{echo foo >&2}。在这种情况下,>&2与|分离,MULTIOS在这里有没有效果。
{echo foo >&2} | grep foo如果您看到我要说的话,我想知道为什么该命令不等同于。我以为我在上面询问的命令会将stdout重定向到stderr,然后将空的stdout用管道传输到grep。