双星号通配符除了“globstar”之外还有其他含义吗?

Does a double-asterisk wildcard mean anything apart from `globstar`?

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

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

根据 this question and the Bash documentation 的答案,双星号表示 globstar 模式匹配:

globstar

If set, the pattern ‘**’ used in a filename expansion context will match all files and zero or more directories and subdirectories. If the pattern is followed by a ‘/’, only directories and subdirectories match.

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

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

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

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

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

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

至于bash和您提出的实际问题,

Is there any scenario outside of globstar for which the Bash shell will interpret ** in any way differently than *?

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

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

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

For example, does the extglob setting alone differentiate the two?

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

但是,noglob 选项完全禁用路径名扩展。如果启用了 noglob,则 *** 各自代表自身,否则将执行路径名扩展。