【问题标题】:Why does `local x` inside a zsh for loop output `x=y`?为什么 zsh for 循环中的 `local x` 会输出 `x=y`?
【发布时间】:2022-09-23 22:20:06
【问题描述】:

给定

for v in a b c; do
  local y
  y=$v
done

Zsh 自动输出以下​​内容:

y=a
y=b

为什么会出现这种情况?有什么用?它不会输出y=c,因此它不可靠eval\'able,但这种行为一定是有原因的。

    标签: shell zsh


    【解决方案1】:

    zshbuiltins(1) 联机帮助页中,我们有

    • local -> "与typeset 相同..."

    • typeset -> ...

      如果未设置 shell 选项 TYPESET_SILENT,则对于引用参数的每个剩余名称已经设置好了,参数的名称和值以赋值的形式打印出来。对于新创建的参数,或者下面列出的任何属性标志与名称一起给出时,不会打印任何内容。

    它出现在 v=b 和 v=c 的迭代中,local y 正在报告上一次迭代.

    我不是 zsh 专家,但如果它像 bash,那么只有 2 个变量作用域:全局和函数局部。没有循环局部变量的概念。

    你应该

    • local y 退出循环,这样它就不会被不必要地重复执行,或者
    • 设置上述shell选项使本地关闭:setopt TYPESET_SILENT

    【讨论】: