zparseopts
我对两个不同版本的 zsh的不同行为感到困惑。基本上,我试图在关联数组中设置默认选项值列表,并使用命令行上指定的任何选项覆盖这些默认值。下面的代码在 zsh 5.0.6 上运行良好,但在 4.3.6 上表现得很奇怪——具体来说,在 zsh 4.3.6 中,如果覆盖单个键,我的整个默认值数组都会被覆盖。
脚本
typeset -A opts
opts=(
--opt1 a
--opt2 b
)
zparseopts -A opts -K -- -opt1: -opt2:
echo ${(k)opts}
运行脚本
$ myscript
--opt1 --opt2 # both zsh 4.3.6 and 5.0.6
$ myscript --opt1 x
--opt1 --opt2 # zsh 5.0.6; element of array is replaced
--opt1 # zsh 4.3.6; adding an element overwrites the whole array, no more opt2
这种行为令人困惑,因为 4.3.6 和 5.0.6 具有相同的选项-K
条目zparseopts
:
-K 使用此选项,当不使用任何规范时,使用 -a 和 -A 选项以及 `=array' 形式指定的数组将保持不变。这允许在调用 zparseopts 之前为它们分配默认值。
答案1
将脚本的最后一行替换为echo ${(kv)opts}
.使用 4.3.6 和 5.0.6 运行应该显示 4.3.6 解释-K
为重置opts
,如果任何给出了选项,而仅在使用时5.0.6
重置(保留或任何其他条目)。opts[--opt1]
--opt1
--opt2
(请注意,这似乎在 5.0.2 和 5.0.6 之间的某个时间发生了变化;您可能需要在 zsh-workers 邮件列表上询问以确认。)=