私のプログラムがstdoutとstderrを端末、ファイル、またはデバイスに送信しないようにしたいと思います。この目的のために、私の頭の中には3つのコマンドが実行されていますが、その違いはわかりません。それぞれが何を意味するのかを説明してください。
# ./run > /dev/null
# ./run > /dev/null 1>&2
# ./run > /dev/null 2>&1
答え1
# ./run > /dev/null
これはstdoutにリダイレクトされます/dev/null
が、stderrには何もしません。 stdoutとstderrからリダイレクトを要求するので、必要に応じて実行されません。
# ./run > /dev/null 1>&2
これはstdoutにリダイレクトされ、次に/dev/null
stderrが()を指す場所1>
にstdout()をリダイレクトします&2
。これはターミナルであり、リダイレクトの前にstdoutが指す場所にすることができます。したがって、ここでの最終的な効果は、(おそらく)stdoutがまったくリダイレクトされず、stderrの場合はまだ何もしません。だからそれはあなたが望むものではありません。
# ./run > /dev/null 2>&1
これはstdoutをにリダイレクト/dev/null
し、次にstderr(2>
)をstdoutが指す場所にリダイレクトします。なぜなら、/dev/null
ちょうどリダイレクトした場所だからです。これがあなたが望むようです。
私はそれらの違いを知りません。
実際、その違いを非常に簡単に区別できるはずです。次のように仮定します./run
。
#!/bin/sh
echo stdout
echo stderr >&2
結果は次のようになります。
# ./run > /dev/null
stderr
# ./run > /dev/null 1>&2
stdout
stderr
# ./run > /dev/null 2>&1
違いは明らかです!