bash 文件通配异常



bash 手册(我在 OSX 上使用版本 4.3.42)指出竖线"|"字符用作文件通配中多个文件模式的分隔符。因此,以下内容应该在我的系统上工作:

projectFiles=./config/**/*|./support/**/*

但是,第二种模式对该目录结构中的最后一个文件给出"权限被拒绝",因此该模式永远不会解析为 projectFiles。我已经尝试了这方面的变体,包括将图案包装在括号中,

projectFiles=(./config/**/*)|(./support/**/*)

这在手册中列出,但这也不起作用。

关于我做错了什么有什么建议吗?

你可能指的是man bash中的这一部分:

   If the extglob shell option is enabled using the shopt builtin, several
   extended pattern matching operators are recognized.  In  the  following
   description, a pattern-list is a list of one or more patterns separated
   by a |.  Composite patterns may be formed using one or more of the fol-
   lowing sub-patterns:
          ?(pattern-list)
                 Matches zero or one occurrence of the given patterns
          *(pattern-list)
                 Matches zero or more occurrences of the given patterns
          +(pattern-list)
                 Matches one or more occurrences of the given patterns
          @(pattern-list)
                 Matches one of the given patterns
          !(pattern-list)
                 Matches anything except one of the given patterns

如前所述,|分隔符在模式列表中工作,但仅在启用extglob时:

shopt -s extglob

试试这个:

projectFiles=*(./config/**/*|./support/**/*)

正如@BroSlow在评论中指出的那样:

请注意,您可以在没有 extglob./{config,support}/**/* 的情况下执行此操作,这将只扩展到带有 config 的路径和支持空格分隔的路径,然后进行模式匹配。或者./@(config|support)/**/* extglob.这两种情况似乎都更干净。

@chepner的评论也值得一提:

此外,在简单的作业中根本不执行通配;请尝试foo=*,然后将echo "$foo"echo $foo进行比较。在阵列分配期间确实会发生通配;见foo=(*); echo "${foo[@]}"

相关内容

  • 没有找到相关文章

最新更新