このコードはautoconf configureスクリプトで見つかりました。次のコードは何をしようとしていますか?私はこのコードをautoconf configureスクリプトで見つけました。次のコードは何をしようとしていますか?
if ${am_cv_autoconf_installed+:} false; then :
$as_echo_n "(cached) " >&6
else
このコードはautoconf configureスクリプトで見つかりました。次のコードは何をしようとしていますか?私はこのコードをautoconf configureスクリプトで見つけました。次のコードは何をしようとしていますか?
if ${am_cv_autoconf_installed+:} false; then :
$as_echo_n "(cached) " >&6
else
多くのものがここで起こっています。それを分解しましょう。
まず、構文${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
にリダイレクトされることを意味します。これは、おそらくスクリプト内の他の場所(おそらくログファイルなど)に設定されている可能性があります。