2017-07-18 1 views

Antwort

1

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).

Verwandte Themen