zsh 本地数组声明导致奇怪的行为

zsh 本地数组声明导致奇怪的行为

我是 zsh 的新手,发现了一些奇怪的行为,但这是最奇怪的。

我在为 .zshrc 文件编写的 zsh 函数中声明本地数组时遇到了这种极其奇怪的行为。当我声明本地数组时,它导致我的提示变得疯狂。我最终将其追溯到两个随机创建的非常奇怪的函数。我将其归结为一个简单的案例:

% function () { local foobar=(); echo frog; }
% echo ${functions[foobar=]}
        echo frog
% echo ${functions[local]}
        echo frog

第一个奇怪的事情是frog匿名函数从未打印出来。但真正奇怪的是,却创建了两个名为foobar=和的函数。local

这导致我的 zsh 提示出现各种问题。每当local使用关键字时,它都会打印frog

我真的很想知道是什么原因导致 zsh 创建这些函数。

我在用zsh 5.0.2

答案1

我发现这一定是我的 zsh 版本中的一个错误。我升级到 zsh 5.6.2,发现该行为已在该版本中得到修复。我也有一个理论,即 zsh 在问题情况下试图做什么。当我运行:

% foo bar() echo hi

它创建了两个函数,foobar,它们都只是echo hi

我认为 zsh 一直将其解释local foobar=()为定义两个函数:localfoobar=。这真的很奇怪,因为我不认为localfoobar=会是有效的函数名称。我很好奇 zsh 源代码中的错误在哪里。

我还发现声明本地数组的正确方法是local -a foobar

相关内容