zsh - 如何使局部变量可用于未使用“eval”定义的内部函数?

zsh - 如何使局部变量可用于未使用“eval”定义的内部函数?

我有一个 zsh 函数,如下所示:

outer_func () {
    local LOCAL_VAR='test'
    inner_func () {
        echo "${LOCAL_VAR}"
    }
}

哪里$LOCAL_VAR不可用inner_func

我知道我可以使用evalto 定义,inner_func以便它可以访问 的值$LOCAL_VAR,我想知道是否还有其他方法可以做到这一点?

编辑:在 zsh 5.8 上测试:

$ cat test.zsh
outer_func () {
    local LOCAL_VAR='test'
    inner_func () {
        echo "${LOCAL_VAR}"
    }
}

echo 'executing outer_func'
outer_func
echo 'executing inner_func'
inner_func

$ ./test.zsh
executing outer_func
executing inner_func

$

编辑2:澄清:我实际上用来outer_func将变量设置为一系列inner_funcs,这对于s的工作至关重要inner_func,并且在定义后outer_func,我需要调用inner_funcs。

答案1

Zsh 中不存在“内部函数”这样的东西。你outer_func所做的是,每次调用它时,它都会创建一个inner_func公开可用的普通函数(并且将覆盖任何名为 的现有函数inner_func)。然而,你outer_func实际上并没有称呼 inner_func。它只是创造它。

您可能想要的是这样的:

outer_func () {
  local LOCAL_VAR='test'
  inner_func
}

inner_func () {
  echo "${LOCAL_VAR}"
}

然后,当你调用时outer_func,结果将是inner_func回声test


PS:您不需要在那里使用局部变量。你可以只使用位置参数反而:

outer_func() {
  inner_func 'test'
}

inner_func() {
  print - "$1"
}

相关内容