如何在被ProcA通过source加载的TCL脚本ScrpB内识别加载源?
判断ScrpB是否由ProcA加载的TCL实现方案
要在ScrpB内部判断是否被ProcA通过source命令加载,你可以通过解析调用栈帧信息实现——之前使用info frame未获取有效信息,大概率是没有正确提取栈帧中的过程字段。以下是具体实现方法:
方法一:检查直接调用者栈帧
在ScrpB的代码中,通过info frame -1获取直接调用当前代码的栈帧上下文,提取其中的过程名进行判断:
# ScrpB.tcl 中的代码 set caller_frame [info frame -1] # 检查栈帧中是否包含proc字段,且对应过程名为ProcA if {[dict exists $caller_frame proc] && [dict get $caller_frame proc] eq "ProcA"} { puts "当前脚本由ProcA加载" } else { puts "当前脚本未被ProcA加载" }
方法二:遍历所有栈帧(处理多层调用场景)
如果ProcA是通过多层嵌套调用执行source加载ScrpB的,你可以遍历所有栈帧,检查是否存在ProcA的调用记录:
# ScrpB.tcl 中的代码 set loaded_by_ProcA 0 foreach frame [info frame] { if {[dict exists $frame proc] && [dict get $frame proc] eq "ProcA"} { set loaded_by_ProcA 1 break } } if {$loaded_by_ProcA} { puts "检测到当前脚本由ProcA加载" } else { puts "未检测到ProcA加载当前脚本" }
注意事项
- 如果ProcA位于特定命名空间下,需要在判断时加上完整的命名空间前缀,例如
::my_ns::ProcA; info frame返回的栈帧信息是字典结构,需确保TCL版本支持字典操作(TCL 8.5及以上默认支持)。
内容的提问来源于stack exchange,提问作者Aharon Grupman
相关产品推荐
相关产品推荐

