autoconfスクリプトの条件文が変数の前に「x」を付けるのはなぜですか?たとえば、BoostをテストするためにGNUによって提供されるマクロには、次のような条件があります。
if test "x$want_boost" = "xyes"; then
これが次のように定義されていないのはなぜですか。
if test "$want_boost" = "yes"; then
autoconfスクリプトの条件文が変数の前に「x」を付けるのはなぜですか?たとえば、BoostをテストするためにGNUによって提供されるマクロには、次のような条件があります。
if test "x$want_boost" = "xyes"; then
これが次のように定義されていないのはなぜですか。
if test "$want_boost" = "yes"; then
初期のシェルの中には、空の文字列変数のテストが今ほど簡単ではなかったため、「x$variable」が「x」と等しいかどうかを確認するのが最善の方法でした。また、それは明らかにを使用しているので、test
健全性や移植性を失うことなく、'$ x!="y"'のようなシーケンスを適切に引用/エスケープしようとするよりも簡単です。
POSIX準拠のシェルでは、
test "$foo" = "$bar"
変数の内容に関係なく、文字列の比較をfoo
行いbar
ます。ただし、古い非準拠のシェルでfoo
は、ダッシュで始まるものが含まれているとtest
、それを単項演算子として解釈しようとするため、構文エラーがスローされるか、間違ったテストが実行されます。書くx"$foo" = x"$bar"
ことはそれを不可能にします。また、どちらかの引数が空の文字列に展開された場合の問題を漠然と思い出しますが、それは二重引用符を省略した場合にのみ発生した可能性があります(この場合、最新のシェルでも問題になります)。
これは、configureスクリプトを作成する場合に特に関係があります。少なくとも原則として、シェル環境がいくら古くても機能するはずだからです。そして、今日、2020年に新しいプログラムを書いている場合、Cとautoconfを使用する最も妥当な理由は、いくつかの古いシステムへの移植性が必要なことです...