双星号通配符是否与“globstar”不同?

时间:2016-05-05 19:02:25

标签: bash ant wildcard glob extglob

我有一个Ant build.xml脚本,其中包含以下代码段:

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

根据this questionBash documentation的答案,双星号表示globstar模式匹配:

  

globstar

     

如果设置,文件名扩展上下文中使用的模式“**”将匹配所有文件以及零个或多个目录和子目录。如果   该模式后跟一个'/',只有目录和子目录   匹配。

这似乎是编写代码的人意味着它可以工作的意义:找到项目库目录中的所有.jar文件,无论深度有多少目录。

但是,代码通常在Bash shell中执行,globstar设置已关闭。在这种情况下,似乎双星号应该被解释为单个星号,这将破坏构建。然而,构建执行得非常好。

globstar以外的任何情况下,Bash shell会以**的方式解释*吗?例如,extglob设置单独区分两者吗?关于此的文件似乎很少。

2 个答案:

答案 0 :(得分:1)

您呈现Ant构建文件的一部分。是什么让您认为bash语法或任何特定bash shell的设置与该文件内容的解释有关? Ant实现了自己的模式匹配;详细信息记录在Ant User Manual中,特别是此处:https://ant.apache.org/manual/dirtasks.html#patterns

关于bash以及您提出的实际问题,

  

在globstar之外是否有任何场景,Bash shell会以不同的方式解释**?

在算术评估的上下文中,*表示乘法,而**表示取幂。

Bash的globstar选项会影响**路径名扩展上下文中bash的解释方式,而不影响其他内容。如果globstar已启用,则**在该上下文中的效果与单独*不同;如果未启用,则**只是两个*通配符,一个接一个,不会更改哪个文件名匹配。

除了这两种情况外,我认为**根本没有bash具有任何特殊含义,但有些情况*本身就是有意义的。例如,$*是表示位置参数列表的特殊变量,如果foo是数组值变量,则${foo[*]}表示数组的所有元素。还有其他几个。在这些地方用**代替*会改变意义;在大多数情况下,它会产生语法错误。

  

例如,extglob设置是否区分了两者?

bash manual对路径名扩展(==文件名扩展)进行了相当冗长的讨论。有几个选项会影响它的各个方面,但唯一一个调整**含义的选项是globstar

noglob选项完全禁用路径名扩展。如果noglob已启用,那么***每个都会在其中执行路径名扩展的上下文中表示自己。

答案 1 :(得分:0)

Ant不使用bash来创建文件集,即所有Java代码。

双星的含义确实如您所述,潜入所有文件夹并在任何子文件夹中找到所有* .jar。但是甚至可以在Windows上运行,在那里通常没有任何地方可以看到bash。