我有一个Ant build.xml
脚本,其中包含以下代码段:
<fileset dir="${project.home}/${project.lib}">
<include name="**/*.jar"/>
</fileset>
根据this question和Bash documentation的答案,双星号表示globstar
模式匹配:
globstar
如果设置,文件名扩展上下文中使用的模式“**”将匹配所有文件以及零个或多个目录和子目录。如果 该模式后跟一个'/',只有目录和子目录 匹配。
这似乎是编写代码的人意味着它可以工作的意义:找到项目库目录中的所有.jar
文件,无论深度有多少目录。
但是,代码通常在Bash shell中执行,globstar
设置已关闭。在这种情况下,似乎双星号应该被解释为单个星号,这将破坏构建。然而,构建执行得非常好。
在globstar
以外的任何情况下,Bash shell会以**
的方式解释*
吗?例如,extglob
设置单独区分两者吗?关于此的文件似乎很少。
答案 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。