为什么函数中的 eval 声明在 bash 中不起作用?

为什么函数中的 eval 声明在 bash 中不起作用?

追踪bash脚本的奇怪行为导致以下 MWE:

set -o errexit
set -o nounset
set -x
my_eval()
{
  eval "$1"
}
my_eval "declare -A ASSOC"
ASSOC[foo]=bar
echo success

失败并显示:line 9: foo: unbound variable.然而,如果eval使用 代替 of my_eval(并且显然,如果declare直接完成,没有任何间接),它就可以工作。

为什么在函数中使用evalling语句与在函数外部执行语句的效果不同?declare

我正在使用GNU bash, version 4.3.46(1)-release (x86_64-pc-linux-gnu)来自流行Ubuntu发行版的Linux.

答案1

浏览man页面告诉我们:

The -g option forces variables to be created or modified at the
global scope, even when **declare** is executed in a shell function.

因此,如果你的脚本会说:

my_eval "declare -gA ASSOC"

它/你会更幸福。

要点是“declare”语句在其执行/评估的位置查看其范围,而不是在其编写的位置。

相关内容