Viele Dinge gehen hier vor. Lass es uns kaputt machen.
Zunächst ist die Syntax ${var+foo}
ein gängiges Idiom für die Überprüfung, ob die Variable var
definiert wurde. Wenn var
definiert ist, wird ${var+foo}
auf die Zeichenfolge foo
erweitert. Andernfalls wird es zu einer leeren Zeichenfolge erweitert.
Am häufigsten (in bash, sowieso), diese Syntax wird wie folgt verwendet:
if [ -n "${var+foo}" ]; then
echo "var is defined"
else
echo "var is not defined"
fi
Beachten Sie, dass foo
nur ein beliebiger Text. Sie könnten auch x
oder abc
oder ilovetacos
verwenden.
In Ihrem Beispiel gibt es jedoch keine Klammern. Also was auch immer ${am_cv_autoconf_installed+:}
expandiert (wenn überhaupt), wird als Befehl ausgewertet. Wie sich herausstellt, ist :
eigentlich ein Shell-Befehl. Es ist nämlich der "Null-Befehl". Dies hat keine Auswirkungen, außer dass der Befehl exit status auf 0
gesetzt wird (Erfolg). Ebenso ist false
ein Shell-Befehl, der nichts tut, aber den Exit-Status auf 1
(Fehler) setzt.
Also je nachdem, ob die Variable am_cv_autoconf_installed
definiert ist, wird das Skript dann eine der folgenden Befehle ausführen:
: false
-ODER-
false
Im ersten Fall, ruft die Null-Befehl mit der Zeichenfolge "false"
als ein Argument, das einfach ignoriert wird, wodurch die if
-Anweisung als true ausgewertet wird. Im zweiten Fall wird der Befehl false
aufgerufen, wodurch die if
-Anweisung als false ausgewertet wird.
Also alles, was wirklich tut, überprüft, ob am_cv_autoconf_installed
definiert ist. Wenn dieses Skript nur ein gewöhnlicher bash waren und erfordern kein besonderes Maß an Portabilität, wäre es viel einfacher gewesen, gerade tun:
if [ -n "${am_cv_autoconf_installed+x}" ]; then
Da dies jedoch ein Configure-Skript ist, ist es kein Zweifel auf diese Weise für maximale Portabilität geschrieben. Nicht alle Schalen haben den -n
Test. Einige haben möglicherweise nicht einmal die [ ]
Syntax.
Der Rest sollte ziemlich selbsterklärend sein. Wenn die Variable definiert ist, wird die if
-Anweisung als wahr ausgewertet (oder genauer gesagt, sie setzt den Exit-Status auf 0
), wodurch die Zeile $as_echo_n "(cached) " >&6
ausgeführt wird. Ansonsten macht es was auch immer in der else
Klausel ist.
Ich denke, $as_echo_n
ist nur die umgebungsspezifische Version von echo -n
, was bedeutet, es wird "(im Cache)" ohne nachlaufende Zeilenschaltung gedruckt.Die >&6
bedeutet, dass die Ausgabe an den Dateideskriptor 6
weitergeleitet wird, der vermutlich an anderer Stelle im Skript eingerichtet ist (wahrscheinlich eine Protokolldatei oder ähnliches).