是否有可能获得当前正在执行的TCL脚本的完整路径?
在PHP中,它将是:__FILE__
答案 0 :(得分:15)
根据“当前正在执行的TCL脚本”的含义,您实际上可能会寻找info script
,甚至可能info nameofexecutable
或更深奥的东西。
答案 1 :(得分:13)
检索当前语句所在文件名的正确方法是(真正等同于PHP / C ++' s __FILE__
):
set thisFile [ dict get [ info frame 0 ] file ]
Psuedocode(它是如何工作的):
set thisFile <value>
:将变量thisFile设置为value
dict get <dict> file
:从dict info frame <#>
:返回一个dict,其中包含有关指定堆栈级别(#
)的帧的信息,0
将返回最近的堆栈帧
注意:有关信息框架的详细信息,请参阅帖子的结尾。 在这种情况下,file
返回的info frame
值已经标准化,因此不需要file normalize <path>
。
info script
和info frame
之间的差异主要用于Tcl包。如果在包需要(info script
)期间提供的Tcl文件中使用require package <name>
,那么info script
将返回当前正在执行的Tcl脚本的路径,并且不会提供实际名称包含info script
命令的Tcl文件;但是,此处提供的info frame
示例将正确返回包含该命令的文件的文件名。
如果您想要当前正在评估的脚本的名称,那么:
set sourcedScript [ info script ]
如果您想要最初调用的脚本(或解释器)的名称,那么:
set scriptAtInvocation $::argv0
如果您想要最初调用的可执行文件的名称,那么:
set exeAtInvocation [ info nameofexecutable ]
更新 - 有关详细信息:info frame
这是堆栈跟踪在Tcl中的样子。 frame_index
向我们展示info frame $frame_index
到0
的值[ info frame ]
的内容。
调用info frame [ info frame ]
在功能上等同于info frame 0
,但使用0
当然更快。
实际上只有1
到[ info frame ]
个堆叠帧,而0
的行为类似于[ info frame ]
。在此示例中,您可以看到0
和5
([ info frame ]
)是相同的:
frame_index: 0 | type = source | proc = ::stacktrace | line = 26 | level = 0 | file = /tcltest/stacktrace.tcl | cmd = info frame $frame_counter
frame_index: 1 | type = source | line = 6 | level = 4 | file = /tcltest/main.tcl | cmd = a
frame_index: 2 | type = source | proc = ::a | line = 2 | level = 3 | file = /tcltest/a.tcl | cmd = b
frame_index: 3 | type = source | proc = ::b | line = 2 | level = 2 | file = /tcltest/b.tcl | cmd = c
frame_index: 4 | type = source | proc = ::c | line = 5 | level = 1 | file = /tcltest/c.tcl | cmd = stacktrace
frame_index: 5 | type = source | proc = ::stacktrace | line = 26 | level = 0 | file = /tcltest/stacktrace.tcl | cmd = info frame $frame_counter
请参阅: https://github.com/Xilinx/XilinxTclStore/blob/master/tclapp/xilinx/profiler/app.tcl#L273
答案 2 :(得分:7)
您需要$argv0
答案 3 :(得分:4)
您也可以使用[file normalize]来获取完全标准化的名称。
file normalize $argv0
file normalize [info nameofexecutable]
答案 4 :(得分:-2)
秒...... lindex $argv 0
是一个很好的起点; - )