2017-07-18 5 views

答えて

1

多くのものがここで起こっています。それを分解しましょう。

まず、構文${var+foo}は、変数varが定義されているかどうかをチェックする共通の慣例です。 varが定義されている場合、${var+foo}は文字列fooに展開されます。それ以外の場合は、空の文字列に展開されます。ただ、任意のテキストです

if [ -n "${var+foo}" ]; then 
    echo "var is defined" 
else 
    echo "var is not defined" 
fi 

fooことを次のように

最も一般的に(bashで、とにかく)、この構文が使用されています。 xまたはabcまたはilovetacosを使用することもできます。

ただし、この例では角括弧はありません。したがって、${am_cv_autoconf_installed+:}に展開されたものは(もしあれば)コマンドとして評価されます。判明したように、:は実際にはシェルコマンドです。すなわち、それは "ヌルコマンド"です。コマンドの終了ステータスを0(成功)に設定する以外は効果がありません。同様に、falseは何もしないシェルコマンドですが、終了ステータスを1(失敗)に設定します。

ように可変am_cv_autoconf_installedが定義されているかどうか、スクリプトは、次のいずれかのコマンドを実行するに応じて第一場合

: false 

-OR-

false 

を、それが呼び出します文字列が"false"のヌルコマンドを引数として使用します。これは単に無視され、ifステートメントがtrueと評価されます。 2番目のケースでは、falseコマンドを呼び出し、ifステートメントをfalseに評価します。

だから、すべてこれは本当にam_cv_autoconf_installedが定義されているかどうかをチェックしているがやっています。しかし、

if [ -n "${am_cv_autoconf_installed+x}" ]; then 

これはconfigureスクリプトであるため、それは間違いありませんでした:これは普通のbashスクリプトであり、移植性のいずれかの特定のレベルを必要としなかった場合、それだけでやってずっと簡単だっただろう最大の移植性のためにこの方法で書かれています。すべてのシェルが-nテストを持つわけではありません。一部の人には[ ]という構文もありません。

残りはかなり自明です。変数が定義されている場合、ifステートメントはtrueと評価されます(またはより正確には、終了ステータスは0に設定されます)。$as_echo_n "(cached) " >&6行が実行されます。それ以外の場合は、else句の中にあるものを実行します。

$as_echo_nは、環境固有のバージョンecho -nであることを意味しています。つまり、末尾に改行がなく「(キャッシュされた)」と表示されます。>&6は、出力がファイル記述子6にリダイレクトされることを意味します。これは、おそらくスクリプト内の他の場所(おそらくログファイルなど)に設定されている可能性があります。

関連する問題