zsh ${var##$pat} 参数扩展,带有包含 globs 的模式 var

zsh ${var##$pat} parameter expansion with pattern var containing globs

似乎 zsh 不支持 变量 模式中的 glob,在 ${var##$pat} 参数扩展中:

$ zsh -c 'pat=/*; var=/etc/; echo "$var $pat"; echo "${var##$pat}"'
/etc/ /*
/etc/
# sh result: empty

但是,如果 $pat 不包含 *,zsh 和 sh 的行为类似:

$ zsh -c 'pat=/; var=/etc/; echo "$var $pat"; echo "${var##$pat}"'
/etc/ /
etc/
# sh result: same

zsh --emulate sh 当然给出了 sh 兼容的结果。但是如果我想留在 zsh 仿真中,是否有任何 setopt 选项可以改变这种行为?我已经(简要地)查看了文档,但我真的找不到造成这种差异的原因。

zsh中,如果您 要求 ${~spec} 扩展或(非常广泛,因此有点危险)GLOB_SUBST 选项:

pat=/*t
var=/etc/
print "${var##$pat}"
#=> /etc/
print "${var##$~pat}"
#=> c/
setopt glob_subst
print "${var##$pat}"
#=> c/

这在 zshexpn 手册页的字符串替换扩展部分 ${name/pattern/repl} 中进行了描述。