列出TCL中所有被引用的文件的命令

3
有没有一个TCL命令可以列出所有被引用的文件?
例如-我在test.tcl文件中引用了a.tcl、b.tcl和c.tcl。是否有一个TCL命令可以查看这些被引用的文件?
1个回答

7
不可以,但是你可以覆盖source命令本身以在某个地方跟踪source的文件,像这样:
rename source __real_source
proc source args {
    global sourced
    lappend sourced $args
    uplevel 1 [linsert $args 0 __real_source]
}

更新:针对Donal关于source命令脆弱性的评论,以下是如何设置执行跟踪:

proc register_sourced {cmd args} {
  global sourced
  lappend sourced [lindex $cmd end]
}
trace add execution source leave register_sourced

1
你的 uplevel 命令中不应该执行 __real_source 吗? - bmk
使用8.6版本,我会这样写:proc source args {lappend ::sourced [lindex $args end];tailcall __real_source {*}$args} - Donal Fellows
考虑到这一点,那段代码将会破坏包的加载。真正的 source 的当前堆栈帧必须是“当前”堆栈帧,这是非常重要的;包机制广泛使用它。它还有一个问题,即 linsert 不会修改变量。在您的代码中已经修复了这个问题... - Donal Fellows
@DonalFellows,那在source命令上加上一个"execution enter" trace怎么样?会起作用吗? - kostix
是的,那样做可以。我没有想到。 :-) - Donal Fellows

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接