我有一个函数(=callee),它应该有效地在调用者中声明和分配几个变量。它还应该能够分辨出它的呼叫者的名字是什么。
现在,我通过将要eval由调用者编辑的字符串返回写入传递的变量来实现前者。
write_local_var_assignments variable_name; eval "$variable_name"
Run Code Online (Sandbox Code Playgroud)
我想我可以通过让调用者通过"$FUNCNAME"或让被调用者调用caller内置函数并解析其输出来实现后者。
所有这些解决方案看起来都很笨拙,所以我有两个问题:
即,我可以压缩:
write_local_var_assignments variable_name; eval "$variable_name"
Run Code Online (Sandbox Code Playgroud)
成刚
run_local_var_assignments
Run Code Online (Sandbox Code Playgroud)
?
在bash(和ksh88, mksh,yash , dash, zsh) 中,局部变量范围是动态的。
这段代码:
f() { a=2; echo "f: $a"; }
g() { local a=1; f; echo "g: $a"; }
a=0
g
echo "global: $a"
Run Code Online (Sandbox Code Playgroud)
产生这个输出:
f: 2
g: 2
global: 0
Run Code Online (Sandbox Code Playgroud)
那是f更新g的$a变量,因为它是从 调用的g。
这与使用typesetin 函数声明的变量形成对比,使用ksh语法 ( function f { ...; }) in声明的函数ksh93或使用privatein声明的变量zsh,您将获得:
f: 2
g: 1
global: 2
Run Code Online (Sandbox Code Playgroud)
因此,在这种情况下,您无需执行任何操作。
至于知道调用你的函数的名称,在bash,你可以使用${FUNCNAME[1]}.
该zsh等效是$funcstack[2]:
$ zsh -c 'f() { echo $funcstack[2]; }; g() { f; }; g'
g
$ bash -c 'f() { echo "${FUNCNAME[1]}"; }; g() { f; }; g'
g
Run Code Online (Sandbox Code Playgroud)