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}
中进行了描述。
似乎 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}
中进行了描述。