2016-05-05 12 views
1

I eine Ant build.xml Skript, das die folgenden Ausschnitt umfasst:Bedeutet ein Doppelstern-Wildcard etwas außer "globstar"?

<fileset dir="${project.home}/${project.lib}"> 
    <include name="**/*.jar"/> 
</fileset> 

Nach den Antworten auf this question und dem Bash documentation ist die doppelsträngige Sternchen angibt globstar pattern-matching:

globstar

Wenn gesetzt, wird das Muster '**', das in einem Dateinamenerweiterungskontext verwendet wird, mit allen Dateien und null oder mehr Verzeichnissen und Unterverzeichnissen übereinstimmen. Wenn auf das Muster ein '/' folgt, stimmen nur die Verzeichnisse und Unterverzeichnisse überein.

Dies scheint der Sinn, in dem sie wer den Code bedeutete es geschrieben zu arbeiten: alle .jar Dateien innerhalb des Projekts Bibliotheksverzeichnis finden, unabhängig davon, wie viele Verzeichnisse tief. Der Code wird routinemäßig in einer Bash-Shell ausgeführt, für die die globstar-Einstellung deaktiviert ist. In diesem Fall scheint es, als ob der Doppelstern als ein einzelner Stern interpretiert werden müsste, der den Build sprengen würde. Trotzdem funktioniert der Build sehr gut.

Gibt es außerhalb von globstar ein Szenario, für das die Bash-Shell ** in irgendeiner Weise anders als * interpretiert? Zum Beispiel, unterscheidet die extglob Einstellung allein die beiden? Die Dokumentation dazu scheint spärlich zu sein.

Antwort

1

Sie präsentieren einen Teil einer Ant-Build-Datei. Was macht Sie denken, dass bash Syntax oder die Einstellungen einer bestimmten bash Shell hat etwas mit der Interpretation der Inhalte dieser Datei zu tun? Ant implementiert seinen eigenen Mustervergleich; Einzelheiten sind in der Ant User Manual und hier insbesondere: https://ant.apache.org/manual/dirtasks.html#patterns dokumentiert.

Was bash und den tatsächlichen Fragen, die Sie gestellt,

Gibt es eine Szenario außerhalb von globstar, für die die Bash-Shell ** in irgendeiner Weise interpretiert anders als *?

Im Zusammenhang mit der arithmetischen Auswertungs bedeutet * Multiplikation, während ** Potenzierung bedeutet.

Die Option globstar von Bash beeinflusst, wie ** in einem bash Pfadnamen-Erweiterungskontext interpretiert wird, und sonst nichts. Wenn globstar aktiviert ist, hat ** in diesem Kontext eine andere Wirkung als * allein; Wenn es nicht aktiviert ist, dann ** ist nur zwei * Wildcards, einer nach dem anderen, der nicht ändert, welche Dateinamen übereinstimmen.

Anders als in den beiden Kontexten Ich glaube nicht ** hat eine besondere Bedeutung zu bash überhaupt, aber es gibt Kontexte, in denen * selbst sinnvoll ist. Zum Beispiel ist $* eine spezielle Variable, die die Liste der Positionsparameter darstellt, und wenn foo eine Array-Wert-Variable ist, dann repräsentiert ${foo[*]} alle Elemente des Arrays. Es gibt ein paar andere. Das Ersetzen von ** für * an diesen Orten ändert die Bedeutung; In den meisten von ihnen erzeugt es einen Syntaxfehler.

Zum Beispiel unterscheidet die Einstellung extglob die beiden?

Die bash manual hat eine ziemlich lange Diskussion der Pfadnamenerweiterung (== Dateinamenerweiterung). Es gibt mehrere Optionen, die verschiedene Aspekte davon betreffen, aber der einzige, der die Bedeutung von ** moduliert, ist globstar.

Die Option noglob deaktiviert die Pfadnamenerweiterung jedoch vollständig. Wenn noglob aktiviert ist, dann stellen sich * und ** jeweils in Kontexten dar, in denen sonst die Pfadnamenerweiterung durchgeführt worden wäre.

+0

Vielen Dank! Ich suchte nach "Ant Doppelstern", "Ant **", "XML Doppelstern", "XML **", usw., und bis "UNIX" fand ich nichts als Verweise auf Potenzierung (was dies eindeutig nicht ist) double asterisk "hat mich zu Bashs" globstar "gebracht. Deshalb nahm ich an, dass es etwas mit Bash zu tun hatte. Danke nochmal für deine Hilfe! – JonahHuron

0

Ant verwendet bash nicht zum Erstellen der Dateigruppe, das ist der gesamte Java-Code.

Die Bedeutung des Doppelsterns ist in der Tat, wie Sie beschreiben, tauchen Sie in alle Ordner und finden Sie alle * .jar in einem beliebigen Unterordner. Aber es funktioniert sogar unter Windows, wo normalerweise nirgends eine Bash zu sehen ist.