Answers:
那就是MULTIOS的效果。
echo foo >&2 | grep foo
将写入foo
stderr并通过管道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。