Das ist der Effekt von MULTIOS .
echo foo >&2 | grep foo
schreibt foo
an stderr und leitet auch foo
an grep
. Da stderr standardmäßig terminal ist, werden zwei foo
Zeilen angezeigt , eine von echo
und eine vom grep
Ergebnis.
{ echo foo >&2 | grep foo } >/dev/null
Hier haben Sie eine Zeile gesehen, weil stdout umgeleitet /dev/null
wurde. Sie haben nur die foo
Zeile von gesehen echo
.
{ echo foo >&2 | grep foo } 2>/dev/null
Hier haben Sie eine Zeile gesehen, weil stderr umgeleitet /dev/null
wurde. Sie haben nur die foo
Zeile von gesehen grep
.
Sie können den Unterschied im Terminal leicht an der Linienausgabefarbe erkennen. grep
hebt das übereinstimmende Muster hervor (oder Sie können es mit erzwingen --color=always
).
MULTIOS
wurde standardmäßig mit nomultios
nicht aktivierter Option aktiviert:
$ unsetopt | grep nomultios
nomultios
Um es zu deaktivieren, setzen Sie einfach die nomultios
Option:
$ setopt nomultios
{echo foo >&2} | grep foo
, wenn Sie sehen, was ich zu sagen versuche. Ich dachte, der Befehl, nach dem ich oben gefragt habe, hätte stdout an stderr umgeleitet und dann leeres stdout an grep weitergeleitet.{echo foo >&2} | grep foo
,{echo foo >&2}
wurde als Befehl betrachtet, und es lief in einer Subshell. Sie können es so denken, wieA | grep foo
woA
ist{echo foo >&2}
. In diesem Fall>&2
und|
wurden getrennt,MULTIOS
hat hier keine Auswirkung.