web-dev-qa-db-ja.com

コマンドがstdoutとstderrの両方を端末またはファイルに送信しないようにする

プログラムがstdoutおよびstderrを端末、ファイル、またはデバイスに送信しないようにしたいと思います。このため、私は3つのコマンドを心に抱いていますが、それらの違いを区別することはできません。それぞれの意味を教えてください。

# ./run > /dev/null
# ./run > /dev/null 1>&2
# ./run > /dev/null 2>&1
6
Saman
# ./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

違いは明らかです!

14
Celada