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

Shell脚本函数内如何获取实际调用该函数的脚本名称?

如何让Shell函数打印实际调用它的脚本名

这问题我之前踩过坑!默认情况下,Shell函数会保留它被定义时的脚本上下文,所以你在script2.sh里定义的logger函数用$0的话,只会输出script2.sh,而不是实际调用它的script3.sh。下面给你几个靠谱的解决办法:

方法1:显式传递调用者脚本名(最通用,兼容所有Shell)

这是最稳妥的方案,不需要依赖Shell的特殊特性。

  1. 修改script2.sh里的logger函数,让它接收一个参数来表示调用者:
# script2.sh
logger() {
    echo "调用我的脚本是: $1"
}
  1. 在script3.sh里调用logger时,把当前脚本名($0)传进去:
# script3.sh
logger "$0"
  1. 主脚本script1.sh正常source这两个脚本即可:
# script1.sh
source script2.sh
source script3.sh

执行sh script1.sh时,就会输出调用我的脚本是: script3.sh了。

方法2:利用调用栈信息(适合bash/zsh等高级Shell)

如果你用的是bash或者zsh,可以用内置的caller命令来获取调用栈的上一层信息,不需要传参数。

修改script2.sh里的logger函数:

# script2.sh
logger() {
    # caller命令会返回 行号 调用者脚本名,用awk提取第二个字段
    local caller_script=$(caller | awk '{print $2}')
    echo "调用我的脚本是: $caller_script"
}

这样script3.sh里直接调用logger就行,不需要传参数。不过要注意:纯POSIX sh(比如dash)没有caller命令,所以这种方法只适用于bash/zsh环境。

方法3:动态绑定函数上下文(不推荐,复杂度高)

还有一种进阶方式是通过eval或者重新定义函数来让logger继承调用者的上下文,但这种方式容易引入bug,维护起来也麻烦,除非特殊需求,不然不建议用。


内容的提问来源于stack exchange,提问作者Djeah

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:49:42