给定
for v in a b c; do
local y
y=$v
done
Zsh自动输出以下内容:
y=a
y=b
为什么会出现这种情况?有什么用?它不会输出y=c
,所以它不能可靠地输出eval
,但这种行为一定有原因。
在zshbuiltins(1)
手册页中,我们有
-
local
->quot;与typeset
相同"> -
typeset
->。。如果未设置shell选项
TYPESET_SILENT
,则对于引用已设置的参数的每个剩余名称,参数的名称和值将以赋值的形式打印出来。对于新创建的参数,或者当下面列出的任何属性标志与名称一起给出时,都不会打印任何内容。
它出现在v=b和v=c的迭代中,local y
报告上一次迭代中y集的值。
我不是zsh专家,但如果它像bash一样,那么只有两个变量作用域:全局和函数局部。循环不存在局部变量的概念。
你应该
- 将
local y
从循环中取出,这样它就不会被不必要地重复执行,或者 - 设置上述shell选项以进行本地关闭:
setopt TYPESET_SILENT