我是 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
它创建了两个函数,foo
和bar
,它们都只是echo hi
。
我认为 zsh 一直将其解释local foobar=()
为定义两个函数:local
和foobar=
。这真的很奇怪,因为我不认为local
或foobar=
会是有效的函数名称。我很好奇 zsh 源代码中的错误在哪里。
我还发现声明本地数组的正确方法是local -a foobar