双星号通配符除了“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
,则 *
和 **
各自代表自身,否则将执行路径名扩展。
我有一个 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
,则 *
和 **
各自代表自身,否则将执行路径名扩展。