在zsh中使用“options”数组声明/排版的奇怪行为

时间:2015-07-30 10:07:15

标签: shell zsh

我试图在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

为什么会有所不同?

1 个答案:

答案 0 :(得分:1)

options下的man zshmodules中记录了ZSH/PARAMETERS个关联数组。我无法解释declare options的行为,但我会注意到即使print $options[@]没有显示任何内容,declare options也会输出开/关值列表。

在上一个示例中,函数定义中的declare options始终声明一个新的局部变量,无论是否已存在同名的全局变量。