追踪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
直接完成,没有任何间接),它就可以工作。
为什么在函数中使用eval
ling语句与在函数外部执行语句的效果不同?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”语句在其执行/评估的位置查看其范围,而不是在其编写的位置。