'''[info] script''' ''?filename?'' returns or sets the name of the file containing the script currently being evaluated . ** See Also ** [main script] : detect when a script is used as the main script in an interpreter . Often used in scripted libraries to run self tests . ** Description ** If a Tcl script file is currently being evaluated , i.e. there is a call to `Tcl_EvalFile()` active or `[source]` is active somewhere up the current call stack , then `[info] script` returns the name of the innermost file being processed. If ''filename'' is specified, then ''filename'' becomes the new return value `[info] script` for the remainder of the evaluation of the current script . Setting a new value of `[info] script` is useful in virtual file system applications. If there is no script currently being evaluated , `[info] script` returns an empty string. ---- [MJL]: I find the description from the manual page rather confusing and poorly worded. So here's my attempt at an explanation: Every Tcl interpreter has an associated "script file" Tcl object, which is initially empty. This can be set by invoking `[info] script ''new_value''` and retrieved by invoking `[info script]`. The function `Tcl_FSEvalFile()`, which is called by the `[source]` command, modifies the script file object as follows: The current value is saved, then set to the name of the file to be evaluated. The file's contents are evaluated , and then the saved value is restored. P.S. Note that `Tcl_EvalFile()` is obsolete. Moreover, as dburns noted in the Chatroom, "I believe `[info] script` is what you want, but the command must be executed before `[source]` finishes reading in the script...hence the `[info] script` must be executed at the top-level within the script file...if embedded in a proc within the script, it's 'too late' by the time the proc is run for 'info script' to work correctly" ---- [schlenk] 2005-04-24: The man page implies that it is impossible to get the filename a proc comes from after `Tcl_FSEvalFile()` or `[source]` has returned. So the only way to do it is to register this info while creating the proc or to use something like [grep] to look for it inside the filesystem. ====== # move the old proc command out of the way rename proc ::tcl::proc # create a replacement proc that registers all occurrences of proc creation # into the global proc_to_filename_map variable ::tcl::proc proc args { global proc_to_filename_map set proc_to_filename_map([lindex $args 0]) [info script] uplevel 1 [linsert $args 0 ::tcl::proc] } ====== With this one can easily find the file for a proc by looking into the array. For Tcl 8.4 and later one could use execution traces on the `[proc]` command to do the same thing without renaming proc, implementation is left as an exercise. ---- [escargo] 2005-08-23 : There is another [idiom] where `[info] script` is used: where a script needs to `[source]` other related scripts so that it can run. For example: ====== source [file join [file dirname [info script]] tkcon.tcl] ====== ** See Also ** [info] : [main script] : <> Command | info | Tcl syntax