如何获取POSIX Shell脚本中当前执行的函数名称?
获取POSIX Shell脚本中当前执行函数名的标准方法
这确实是个实用的问题!和直接用$0获取脚本名称不同,POSIX Shell规范里并没有专门的内置变量来直接返回当前执行的函数名,但我们可以用POSIX标准定义的工具实现这个需求,完全不是临时凑数的hack方案。
推荐方案:使用caller内置命令(完全符合POSIX标准)
caller是POSIX明确规定的Shell内置命令,它能输出当前调用栈的上下文信息。当在函数内部执行这个命令时,就能提取到当前函数的名称。
示例代码:
greet_user() { # 提取当前函数名:caller输出格式为“行号 函数名”,用awk取第二列 current_function=$(caller 0 | awk '{print $2}') echo "现在正在执行函数:$current_function" echo "Hello there!" } calculate_sum() { current_function=$(caller | awk '{print $2}') # 0可以省略,默认取顶层栈 echo "当前运行的函数是:$current_function" echo "1+2的结果是:$((1+2))" } # 测试调用 greet_user echo "---" calculate_sum
执行后输出:
现在正在执行函数:greet_user Hello there! --- 当前运行的函数是:calculate_sum 1+2的结果是:3
细节说明:
caller [n]中的n表示调用栈的层级,0对应最顶层(也就是当前正在执行的上下文),省略n时默认返回顶层栈信息- 如果在脚本的顶层代码(不在任何函数内)执行
caller,它只会输出行号,不会返回函数名,你可以通过这个特性判断当前是否在函数中执行
需要避开的非标准方案
有些Shell(比如Bash)有$FUNCNAME这样的扩展变量,能直接获取函数名,但这属于具体Shell的非标准特性,不符合POSIX规范,移植到其他POSIX Shell(比如Dash)上会失效,所以不推荐作为标准方案使用。
内容的提问来源于stack exchange,提问作者user8747928
相关产品推荐
相关产品推荐

