为何zsh参数展开时引号未按文档移除?fdfind示例解析
为什么zsh中用字符串变量传参fdfind无法排除.git目录?
问题核心:引号的本质差异
你写的字符串变量定义:
opts='--hidden --no-ignore --exclude ".git"' fdfind ${=opts}
这里的双引号是字符串内容的一部分,并非shell用来解析参数的语法引号。当${=opts}按空格拆分后,传递给fdfind的实际参数是:--hidden、--no-ignore、--exclude、".git"——fdfind会去匹配名字带双引号的".git"目录,而非真实存在的.git目录,所以无法实现排除效果。
对照zsh文档的逻辑说明
官方文档提到的“参数展开完成后移除未加引号的\、'、"”,针对的是shell语法层面未被包裹的引号。比如直接执行fdfind --exclude ".git"时,双引号是shell语法,用来确保.git作为单个参数,展开后引号会被移除,传给fdfind的是纯.git。但你把引号放进单引号包裹的字符串里,它就变成了普通字符,不会被shell处理移除。
数组方式有效的原因
zsh的数组是专门用于存储多个独立参数的结构:
opts=(--hidden --no-ignore --exclude ".git") fdfind $opts
数组中的每个元素都是独立参数,.git外层的双引号是shell语法(仅用于避免不必要的拆分,这里其实可以省略),传递给fdfind时,--exclude对应的参数就是纯.git,能正确匹配目标目录,因此可以正常排除。
内容的提问来源于stack exchange,提问作者Magnus
相关产品推荐
相关产品推荐

