2016-05-05 5 views
1

У меня есть Ant build.xml сценарий, который включает в себя следующий фрагмент:Подстановочный знак двойной звездочки означает что-либо отдельно от `globstar`?

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

В соответствии с ответами на this question и Bash documentation, двойной звездочка указывает globstar сопоставления с образцом:

globstar

Если установлено, шаблон '**', используемый в контексте расширения имени файла, будет соответствовать всем файлам и нулю или более каталогам и подкаталогам. Если , за шаблоном следует '/', только каталоги и подкаталоги .

Это, кажется, смысл, в котором тот, кто написал код, имел в виду, чтобы работать: не найти все .jar файлы в каталоге библиотеки проекта, независимо от того, сколько каталогов глубоко.

Однако код обычно выполняется в оболочке Bash, для которой отключена настройка globstar. В этом случае кажется, что двойная звездочка должна интерпретироваться как одна звездочка, которая разбила бы сборку. Тем не менее, сборка выполняется отлично.

Есть ли какой-либо сценарий вне globstar, для которого оболочка Bash будет интерпретировать ** никак иначе, чем *? Например, делает ли одна установка extglob отличительной? Документация по этому вопросу кажется редкой.

ответ

1

Вы представляете часть файла сборки Ant. Что заставляет вас думать, что синтаксис bash или настройки какой-либо конкретной оболочки bash имеют отношение к интерпретации содержимого этого файла? Ant реализует собственное сопоставление шаблонов; детали задокументированы в Ant User Manual, и, в частности, здесь: https://ant.apache.org/manual/dirtasks.html#patterns.

Что касается bash и актуальных вопросов, связанных вы,

Есть ли сценарий за пределами globstar, для которого Bash оболочка будет интерпретировать ** никак иначе, чем *?

В контексте оценки арифметического, * означает умножение, тогда как ** означает возведение в степень.

Параметр Bash's globstar влияет на то, как ** интерпретируется в контексте расширения имени пути, и ничего больше. Если globstar включен, то ** имеет другой эффект в этом контексте, чем *; если он не включен, то ** - это всего лишь две маски *, одна за другой, которая не меняет имена файлов.

Другое, чем в этих двух контекстах, я не думаю, что ** имеет какое-либо особое значение для bash, но есть контексты, в которых * сам по себе имеет смысл. Например, $* - это специальная переменная, представляющая список позиционных параметров, и если foo является переменной с массивом, то ${foo[*]} представляет все элементы массива. Есть еще несколько других. Подстановка ** для * в этих местах изменяет значение; в большинстве случаев он создает синтаксическую ошибку.

Например, действительно ли установка extglob отличается от двух?

bash manual имеет довольно длительное обсуждение расширения пути (== расширение файла). Существует несколько вариантов, которые влияют на различные его аспекты, но единственное, что модулирует значение **, это globstar.

Опция noglob отключает расширение имени пути вообще. Если noglob включен, то * и ** каждый представляет себя в контекстах, где в противном случае было бы выполнено расширение пути.

+0

Спасибо! Я искал «Ant double asterisk», «Ant **», «XML double asterisk», «XML **» и т. Д., И я никогда не нашел ничего, кроме ссылок на возведение в степень (чего это явно не так), пока «UNIX двойная звездочка "доставила меня к« globstar »Баша. Вот почему я предположил, что это имеет какое-то отношение к Башу. В очередной раз благодарим за помощь! – JonahHuron

0

Ant не использует bash для создания набора файлов, то есть всего кода Java.

Смысл двойной звезды в том, что вы описываете, чтобы погрузиться во все папки и найти все * .jar в любой подпапке. Но работает даже в Windows, где, как правило, нигде не видно никого.