Означает ли подстановочный знак в виде двойной звездочки что-либо, кроме «globstar»?

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

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

Согласно ответам на этот вопрос и документация Bash, двойная звездочка указывает на globstar соответствие шаблону:

globstar

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

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

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

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


person JonahHuron    schedule 05.05.2016    source источник


Ответы (2)


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

Что касается bash и вопросов, которые вы задали,

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

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

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

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

Например, различает ли их только параметр extglob?

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

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

person John Bollinger    schedule 05.05.2016
comment
Спасибо! Я искал двойную звездочку Ant, Ant **, двойную звездочку XML, XML ** и т. д. и никогда не находил ничего, кроме ссылок на возведение в степень (что явно не так), пока двойная звездочка UNIX не привела меня к globstar Bash. Вот почему я предположил, что это как-то связано с Bash. Еще раз спасибо за помощь! - person JonahHuron; 06.05.2016

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

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

person Harald    schedule 05.05.2016