なぜリダイレクトが括弧の外にあるのか疑問に思っていると思います。
この行で:
if ( $PROG --version ) < /dev/null > /dev/null 2>&1; then
括弧はif
ステートメントの構文の一部ではありません。コマンドのグループ化を指定するだけです。(私自身、そのことを思い出すのに少し時間がかかりました。csh/tcsh では、括弧はif
ステートメントの構文の一部です。)
たとえば、次のようになります。
( echo one ; echo two ) | tr a-z A-Z
次の出力が生成されます。
ONE
TWO
この場合、$PROG --version
は単一のコマンドであるため、括弧は不要です ($PROG
複数のコマンドに展開される場合を除きますが、その可能性は低いです)。
if
したがって、リダイレクトはステートメントには適用されません。に適用され$PROG --version
ます。目的は、(空のファイルから読み取るかのように) に入力を提供せず$PROG
、stdout または stderr に書き込むものをすべて破棄することです。$PROG
が stdin から読み取るコマンドである場合、 で呼び出された場合でも--version
、入力リダイレクトがないと、キーボード入力を待機してハングする可能性があります。
$PROG
スクリプトは、エラーが発生しない場合にのみ (それが何であれ)呼び出しても安全であると想定してい$PROG --version
ます。
if ステートメントにリダイレクトを適用できることに注意してください。
if test_command ; then
something
else
something_else
fi < /dev/null > /dev/null 2>&1
test_command
これにより、 、something
、および の入力と出力がリダイレクトされますsomething_else
。