回答:
これがMULTIOSの効果です。
echo foo >&2 | grep foo
foo
stderrに書き込み、さらににパイプ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
)。
MULTIOS
nomultios
オプションが設定解除されてデフォルトで有効になりました:
$ 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にパイプ処理すると考えていました。