bash 中的调用者感知函数

PSk*_*cik 2 bash function

我有一个函数(=callee),它应该有效地在调用者中声明和分配几个变量。它还应该能够分辨出它的呼叫者的名字是什么。

现在,我通过将要eval由调用者编辑的字符串返回写入传递的变量来实现前者。

 write_local_var_assignments variable_name; eval "$variable_name"
Run Code Online (Sandbox Code Playgroud)

我想我可以通过让调用者通过"$FUNCNAME"或让被调用者调用caller内置函数并解析其输出来实现后者。

所有这些解决方案看起来都很笨拙,所以我有两个问题:

  1. 被调用者是否可以在没有调用者合作的情况下将局部变量分配到调用者的上下文中?

即,我可以压缩:

 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)

?

  1. 有没有更好的方法来获取函数调用者的名称?无需解析或命令替换即可直接获得结果会很好。

Sté*_*las 6

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)