You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:47:55