なぜリダイレクトがかっこの外側にあるのだろうと思います。この行で
:
if ($PROG --version) </dev/null> /dev/null 2>&1; then
括弧がif
文の構文の一部ではありません。コマンドグループを指定するだけです。 (これは私自身ということを覚えている瞬間を取った; CSH/tcshの中で、はif
文の構文の一部である括弧。)
たとえば、この:
(echo one ; echo two) | tr a-z A-Z
は、この出力を生成します:$PROG --version
以来、この場合
ONE
TWO
は、単一のコマンドである、(
$PROG
が複数のコマンドに展開されない限り、それはそうだ)括弧は不要です。
したがって、リダイレクトはif
ステートメントには適用されません。 $PROG --version
に適用されます。目的は、入力を空のファイルから読み込む場合のように、$PROG
にし、stdoutまたはstderrに書き込むものをすべて破棄することです。 $PROG
がstdinから読み取るコマンドである場合、--version
で起動しても、入力リダイレクションなしでキーボード入力を待つことができます。
$PROG --version
でエラーが発生しない場合にのみ、$PROG
(何でも構いません)を呼び出すことが安全であると想定しています。あなたは if文へのリダイレクトを適用することができます
注:
if test_command ; then
something
else
something_else
fi </dev/null> /dev/null 2>&1
これはtest_command
、something
、とsomething_else
の入力と出力をリダイレクトします。
ありがとうございました。私は '$ PROG'が何であるかを知っていて、' PROG --version'が入力を待っていないことがわかっていると、これがどれだけ役に立っているのかまだ分かりません。例えば、 'PROG = autoconf'はこれを見た場所です。そして、私は 'autoconf --version'が入力を待っていないことを知っています。この場合でもまだ有効ですか? –
@Carl Norumは、コマンドを実行するために 'if( '$ PROG --version')'(山括弧付き)を使うことができ、 ' dev/null'の必要はありませんか? – fduff
角かっこ? –