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[@]}"