zsh下${var##$pat}参数扩展含通配符模式变量不生效如何配置setopt?
解决方法
你要找的控制选项是GLOB_SUBST,开启后zsh就会在参数扩展的模式匹配场景中,解析变量内容里的通配符,和POSIX sh的行为保持一致。
全局生效配置
在你的.zshrc中加入以下行即可永久生效:
setopt GLOB_SUBST
测试效果:
$ setopt GLOB_SUBST $ zsh -c 'pat=/*; var=/etc/; echo "$var $pat"; echo "${var##$pat}"' /etc/ /* # 输出为空,和sh执行结果一致
单次临时生效(更安全)
如果不想全局修改配置影响其他逻辑,可以只在需要通配符解析的变量前加~修饰符,单次启用通配符解析:
# 不需要提前设置setopt $ zsh -c 'pat=/*; var=/etc/; echo "$var $pat"; echo "${var##${~pat}}"' /etc/ /* # 输出为空,和sh执行结果一致
差异原因说明
zsh原生模式默认关闭变量内容的通配符解析,是为了避免变量中意外包含的通配符导致非预期的匹配结果,只有显式开启GLOB_SUBST或者用~修饰符时才会将变量中的*、?等字符当作通配符处理。
内容的提问来源于stack exchange,提问作者usretc
相关产品推荐
相关产品推荐

