zsh E / A-Umleitung: Umleiten und dann Weiterleiten; Was ist los?

8

Kann jemand erklären, was in diesem Befehl vor sich geht:

echo foo >&2 | grep foo

Zsh (5.0.2) wird foozweimal gedruckt . Eine scheinbar zu stdout und eine zu stderr, da diese Befehle ausgeführt werden:

{ echo foo >&2 | grep foo } >/dev/null

und:

{ echo foo >&2 | grep foo } 2>/dev/null

beide drucken nur fooeinmal.

Zorawar
quelle

Antworten:

5

Das ist der Effekt von MULTIOS .

echo foo >&2 | grep foo

schreibt fooan stderr und leitet auch fooan grep. Da stderr standardmäßig terminal ist, werden zwei fooZeilen angezeigt , eine von echound eine vom grepErgebnis.

{ echo foo >&2 | grep foo } >/dev/null

Hier haben Sie eine Zeile gesehen, weil stdout umgeleitet /dev/nullwurde. Sie haben nur die fooZeile von gesehen echo.

{ echo foo >&2 | grep foo } 2>/dev/null

Hier haben Sie eine Zeile gesehen, weil stderr umgeleitet /dev/nullwurde. Sie haben nur die fooZeile von gesehen grep.

Sie können den Unterschied im Terminal leicht an der Linienausgabefarbe erkennen. grephebt das übereinstimmende Muster hervor (oder Sie können es mit erzwingen --color=always).


MULTIOSwurde standardmäßig mit nomultiosnicht aktivierter Option aktiviert:

$ unsetopt | grep nomultios
nomultios

Um es zu deaktivieren, setzen Sie einfach die nomultiosOption:

$ setopt nomultios
cuonglm
quelle
Ah, ich wusste nicht, dass zsh das kann! Ich verstehe (im Grunde) die Umleitung, ich wollte wissen, warum der Befehl nicht gleichbedeutend ist {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.
Zorawar
@ Zorawar: Diese Frage wurde in Ihrem Beitrag nicht angesprochen, daher werde ich hier antworten. In {echo foo >&2} | grep foo, {echo foo >&2}wurde als Befehl betrachtet, und es lief in einer Subshell. Sie können es so denken, wie A | grep foowo Aist {echo foo >&2}. In diesem Fall >&2und |wurden getrennt, MULTIOShat hier keine Auswirkung.
Cuonglm
@Zorawar In diesem Fall habe ich Multios ausgeschaltet. Es ist eine nette Idee, aber in der Praxis fand ich sie oft nervig und selten nützlich.
Gilles 'SO - hör auf böse zu sein'
@cuonglm, ich habe eine andere Frage, die hier gestellt wird , aber keine Antwort bekommen hat. Wenn Sie es wissen und auch Zeit haben, können Sie bitte helfen?
Liu Sha