我试图在zsh的脚本中声明一个名为options
的变量。原来它是一些保留名称,zsh在它下面存储一个关联数组。
function mcve() {
options='';
}
$ mcve
mcve:1: options: attempt to set slice of associative array
试图用declare
查看其内容并遇到一个奇怪的行为。在上述错误首次出现之前和之后输出不同。
$ zsh
$ declare options
options
$ zsh
$ mcve
mcve:1: options: attempt to set slice of associative array
$ declare options
options=(autolist on printexitvalue off...<20 more lines>)
发生了什么事?为什么输出不同?是否在首次尝试使用它时声明了options
数组?
我听说过typeset
should be used而不是declare
,但我man zshbuiltins
说他们完全平等。
此外,这也没有失败:
function mcve() {
declare options;
options='';
echo ok;
}
$ zsh
$ mcve
ok
为什么会有所不同?
答案 0 :(得分:1)
在options
下的man zshmodules
中记录了ZSH/PARAMETERS
个关联数组。我无法解释declare options
的行为,但我会注意到即使print $options[@]
没有显示任何内容,declare options
也会输出开/关值列表。
在上一个示例中,函数定义中的declare options
始终声明一个新的局部变量,无论是否已存在同名的全局变量。