1

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

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

根据这个问题的答案和Bash 文档,双星号表示globstar模式匹配:

globstar

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

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

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

是否有任何场景之外globstar的 Bash shell 会以**任何不同的方式解释*?例如,extglob仅设置是否可以区分两者?这方面的文档似乎很少。

4

2 回答 2

1

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

至于bash你提出的实际问题,

在 globstar 之外,Bash shell 是否会以与 * 不同的方式解释 **?

在算术评估的上下文中,*意味着乘法,而**意味着取幂。

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

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

例如,单独的 extglob 设置是否可以区分两者?

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

但是,该noglob选项完全禁用路径名扩展。如果noglob启用,则*每个**都在将执行路径名扩展的上下文中表示自己。

于 2016-05-05T20:30:38.323 回答
0

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

双星的含义确实如你所描述的,深入所有文件夹,在任何子文件夹中找到所有*.jar。但即使在 Windows 上也能正常工作,那里通常在任何地方都看不到 bash。

于 2016-05-05T20:28:17.480 回答