Fullpath of current TCL script
Is there a possibility to get the full path of the currently executing TCL script?
In PHP i开发者_StackOverflowt would be: __FILE__
Depending on what you mean by "currently executing TCL script", you might actually seek info script
, or possibly even info nameofexecutable
or something more esoteric.
The correct way to retrieve the name of the file that the current statement resides in, is this (a true equivalent to PHP/C++'s __FILE__
):
set thisFile [ dict get [ info frame 0 ] file ]
Psuedocode (how it works):
set thisFile <value>
: sets variable thisFile tovalue
dict get <dict> file
: returns the file value from a dictinfo frame <#>
: returns a dict with information about the frame at the specified stack level (#
), and0
will return the most recent stack frame NOTICE: See end of post for more information on info frame.
In this case, the file
value returned from info frame
is already normalized, so file normalize <path>
in not needed.
The difference between info script
and info frame
is mainly for use with Tcl Packages. If info script
was used in a Tcl file that was provided durring a package require (require package <name>
), then info script
would return the path to the currently executing Tcl script and would not provide the actual name of the Tcl file that contained the info script
command; However, the info frame
example provided here would correctly return the file name of the file that contains the command.
If you want the name of the script currently being evaluated, then:
set sourcedScript [ info script ]
If you want the name of the script (or interpreter) that was initially invoked, then:
set scriptAtInvocation $::argv0
If you want the name of the executable that was initially invoked, then:
set exeAtInvocation [ info nameofexecutable ]
UPDATE - Details about: info frame
Here is what a stacktrace looks like within Tcl. The frame_index
is the showing us what info frame $frame_index
looks like for values from 0
through [ info frame ]
.
Calling info frame [ info frame ]
is functionally equivalent to info frame 0
, but using 0
is of course faster.
There are only actually 1
to [ info frame ]
stack frames, and 0
behaves like [ info frame ]
. In this example you can see that 0
and 5
(which is [ info frame ]
) are the same:
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
See: https://github.com/Xilinx/XilinxTclStore/blob/master/tclapp/xilinx/profiler/app.tcl#L273
You want $argv0
You can use [file normalize] to get the fully normalized name, too.
file normalize $argv0
file normalize [info nameofexecutable]
seconds after I've posted my question ... lindex $argv 0
is a good starting point ;-)
精彩评论