Правильный способ получения имени файла, в котором находится текущий оператор, заключается в следующем (истинный эквивалент __FILE__
) PHP / C ++:
set thisFile [ dict get [ info frame 0 ] file ]
Psuedocode (как это работает):
set thisFile <value>
: устанавливает переменную thisFile в value
dict get <dict> file
: возвращает значение файла из dict info frame <#>
: возвращаетпродиктуйте информацию о фрейме на указанном уровне стека (#
), а 0
вернет самый последний фрейм стека ПРИМЕЧАНИЕ. Дополнительную информацию о фрейме см. в конце сообщения.
В этом случае значение file
, возвращаемое из info frame
, уже нормализовано, поэтому file normalize <path>
не требуется.
Разница между info script
и info frame
в основномдля использования с пакетами Tcl.Если info script
использовалось в Tcl-файле, который был предоставлен во время требования пакета (require package <name>
), то info script
вернул бы путь к текущему исполняемому Tcl-скрипту и не предоставил бы фактическое имя Tcl-файла, который содержалкоманда info script
;Однако приведенный здесь пример 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