【问题标题】:Does a double-asterisk wildcard mean anything apart from `globstar`?双星号通配符是否意味着除了 `globstar` 之外的任何东西?
【发布时间】:2016-05-05 19:02:24
【问题描述】:

我有一个 Ant build.xml 脚本,其中包含以下 sn-p:

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

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

globstar

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

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

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

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

【问题讨论】:

    标签: bash ant wildcard glob extglob


    【解决方案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,则*** 各自代表其自身在执行路径名扩展的上下文中。

    【讨论】:

    • 谢谢!我搜索了“Ant double asterisk”、“Ant **”、“XML double asterisk”、“XML **”等,但在“UNIX双星号”将我带到 Bash 的 globstar。这就是为什么我认为它与 Bash 有关。再次感谢您的帮助!
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-22
      • 2015-03-26
      • 1970-01-01
      • 2011-05-15
      • 2017-06-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多