18

これに頭を包むことはできません。ステートメント/dev/nullへの入力として使用されるのはなぜですか?if次の用途は何< /dev/nullですか?

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

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

4

2 に答える 2

17

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

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

于 2012-09-11T06:33:53.967 に答える
15

なぜリダイレクトが括弧の外にあるのか疑問に思っていると思います。

この行で:

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

于 2012-09-11T07:01:33.743 に答える