2012-09-11 13 views
17

私はこれを回避することはできません。 /dev/nullif文の入力として使用するのはなぜですか?以下で< /dev/nullの使用は何ですか?if()</ dev/null

if ($PROG --version) </dev/null> /dev/null 2>&1; then 
     $PROG 
else 
     echo "failed" 
     exit 1 
fi 

I(だと思う)私は> /dev/null 2>&1がちょうどstdoutstderr両方から任意の出力を抑制するために使用されていることを理解しています。

答えて

15

$PROGstdinからの入力を想定したプログラムであれば、あなたのスクリプトはあなたが何かを入力するのを待っている永遠に停止する可能性があります。< /dev/nullの使用は、このようなプログラムに空の入力を提供することです。あなたは>2>&1について正しいです。

このスニペットスクリプトは、$PROG --versionが0の状態(成功)で終了しているかどうかを確認していて、フラグなしでそのプログラムを実行しています。 $PROG --versionが失敗すると、スクリプトは「失敗した」とエコーして終了します。

+0

ありがとうございました。私は '$ PROG'が何であるかを知っていて、' PROG --version'が入力を待っていないことがわかっていると、これがどれだけ役に立っているのかまだ分かりません。例えば、 'PROG = autoconf'はこれを見た場所です。そして、私は 'autoconf --version'が入力を待っていないことを知っています。この場合でもまだ有効ですか? –

+0

@Carl Norumは、コマンドを実行するために 'if( '$ PROG --version')'(山括弧付き)を使うことができ、 ' fduff

+0

角かっこ? –

13

なぜリダイレクトがかっこの外側にあるのだろうと思います。この行で

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_commandsomethingsomething_elseの入力と出力をリダイレクトします。

+0

すばらしい答えをありがとう!私は実際にかっこに関して混乱していました。私のためにそれを分解し、例を挙げてくれてありがとう。素晴らしい説明。 –

関連する問題