Shell脚本函数内如何获取实际调用该函数的脚本名称?
如何让Shell函数打印实际调用它的脚本名
这问题我之前踩过坑!默认情况下,Shell函数会保留它被定义时的脚本上下文,所以你在script2.sh里定义的logger函数用$0的话,只会输出script2.sh,而不是实际调用它的script3.sh。下面给你几个靠谱的解决办法:
方法1:显式传递调用者脚本名(最通用,兼容所有Shell)
这是最稳妥的方案,不需要依赖Shell的特殊特性。
- 修改
script2.sh里的logger函数,让它接收一个参数来表示调用者:
# script2.sh logger() { echo "调用我的脚本是: $1" }
- 在
script3.sh里调用logger时,把当前脚本名($0)传进去:
# script3.sh logger "$0"
- 主脚本
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
相关产品推荐
相关产品推荐

