为何Bash与Zsh的路径扩展(**/*.xml)结果存在差异?
Bash与Zsh中
echo ./**/*.xml路径扩展结果不同的原因 这个差异完全是Bash和Zsh对**通配符的默认处理逻辑不一样导致的,具体细节可以拆成两点来看:
Bash的默认行为有两个限制
默认状态下,Bash对**通配符的处理比较保守:- 它只会匹配一级子目录里的文件,不会深入到更深层级的嵌套子目录(比如
xl/theme/、xl/worksheets/这种二级目录就被直接忽略了); - 它不会把当前目录纳入
**的匹配范围,所以根目录下的[Content_Types].xml也没被包含进来。
要是想让Bash实现和Zsh一样的效果,只需要开启它的
globstar选项就行:shopt -s globstar开启后,
**就会支持深度递归匹配所有层级的子目录,同时也会包含当前目录,再执行echo ./**/*.xml就能得到和Zsh完全一样的输出了。- 它只会匹配一级子目录里的文件,不会深入到更深层级的嵌套子目录(比如
Zsh的默认规则更宽松
Zsh从设计上就把**当成了全递归通配符来用:- 它会自动遍历当前目录下所有层级的子目录,不管嵌套多深都能找到对应的文件;
- 它默认会把当前目录纳入
**的匹配范围,所以根目录下的[Content_Types].xml也能被匹配到。
这就是为什么Zsh能一次性输出所有XML文件的原因。
内容的提问来源于stack exchange,提问作者Run
相关产品推荐
相关产品推荐

