コマンドがstdoutとstderrを端末またはファイルに送信するのを防ぐ

コマンドがstdoutとstderrを端末またはファイルに送信するのを防ぐ

私のプログラムが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/nullstderrが()を指す場所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

違いは明らかです!

関連情報