プログラムがstdoutおよびstderrを端末、ファイル、またはデバイスに送信しないようにしたいと思います。このため、私は3つのコマンドを心に抱いていますが、それらの違いを区別することはできません。それぞれの意味を教えてください。
# ./run > /dev/null
# ./run > /dev/null 1>&2
# ./run > /dev/null 2>&1
# ./run > /dev/null
これはstdoutを/dev/null
にリダイレクトしますが、stderrでは何もしません。 stdoutとstderrからリダイレクトするように要求したので、これはあなたが望むことをしません。
# ./run > /dev/null 1>&2
これはstdoutを/dev/null
にリダイレクトし、次にstdoutを再度リダイレクトします(1>
)stderrが指す場所(&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
違いは明らかです!