回答:
これがMULTIOSの効果です。
echo foo >&2 | grep foo
foostderrに書き込み、さらににパイプfooしgrepます。stderrのデフォルトはterminalであるため、2つのfoo行が表示されます。1 つはからecho、もう1つはgrep結果からです。
{ echo foo >&2 | grep foo } >/dev/null
ここでは、stdoutがにリダイレクトされたために1行表示され/dev/nullましたfooが、からの行しか表示されていませんecho。
{ echo foo >&2 | grep foo } 2>/dev/null
ここでは、stderrがにリダイレクトされたために1行表示され/dev/nullましたfooが、からの行しか表示されていませんgrep。
端末の違いはライン出力色で簡単に確認できます。grep一致したパターンを強調表示します(またはを使用して強制することもできます--color=always)。
MULTIOSnomultiosオプションが設定解除されてデフォルトで有効になりました:
$ unsetopt | grep nomultios
nomultios
それを無効にするには、nomultiosオプションを設定するだけです:
$ setopt nomultios
{echo foo >&2} | grep foo、{echo foo >&2}コマンドと見なされ、サブシェルで実行されました。あなたはそれがA | grep fooどこにAあるかのように考えることができます{echo foo >&2}。この場合、>&2および|分離し、MULTIOSここでは効果がありません。
{echo foo >&2} | grep fooしています。私が言っていることがわかると、コマンドがと同等ではなかった理由を知りたかったのです。上記で質問したコマンドは、stdoutをstderrにリダイレクトし、空のstdoutをgrepにパイプ処理すると考えていました。