Ответ 1
Вы хотите $argv0
Есть ли возможность получить полный путь для текущего TCL script?
В PHP это будет: __FILE__
Вы хотите $argv0
В зависимости от того, что вы подразумеваете под "выполнением TCL script", вы можете действительно искать info script
или, возможно, даже info nameofexecutable
или что-то более эзотерическое.
Правильный способ получить имя файла, в котором находится текущий оператор, - это (настоящий эквивалент PHP/С++ __FILE__
):
set thisFile [ dict get [ info frame 0 ] file ]
Psuedocode (как это работает):
set thisFile <value>
: присваивает переменной thisFile значение value
dict get <dict> file
: возвращает значение файла из dictinfo frame <#>
: возвращает dict с информацией о кадре на указанном уровне стека (#
), а 0
возвращает самый последний стек кадров
УВЕДОМЛЕНИЕ. См. Конец сообщения для получения дополнительной информации о информационном кадре.В этом случае значение file
, возвращаемое из info frame
, уже нормализовано, поэтому file normalize <path>
не требуется.
Разница между info script
и info frame
в основном предназначена для использования с пакетами Tcl. Если info script
был использован в Tcl файле, который был предоставлен при требовании пакета (require package <name>
), тогда info script
вернет путь к текущему исполняемому Tcl script и не предоставит фактическое имя файла Tcl который содержал команду info script
; Однако приведенный здесь пример info frame
корректно возвращает имя файла, содержащего эту команду.
Если вы хотите в настоящее время оценивать имя script, то:
set sourcedScript [ info script ]
Если вы хотите, чтобы изначально было вызвано имя script (или интерпретатора), выполните следующие действия:
set scriptAtInvocation $::argv0
Если вы хотите, чтобы имя исполняемого файла было изначально вызвано, выполните следующие действия:
set exeAtInvocation [ info nameofexecutable ]
ОБНОВЛЕНИЕ - Подробная информация о: info frame
Вот как выглядит стекtrace внутри Tcl. frame_index
показывает нам, что выглядит как info frame $frame_index
для значений от 0
до [ info frame ]
.
Вызов info frame [ info frame ]
функционально эквивалентен info frame 0
, но использование 0
, конечно, быстрее.
Есть только фактические 1
to [ 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
Вы можете использовать [file normalize] для получения полностью нормализованного имени.
file normalize $argv0
file normalize [info nameofexecutable]
секунд после того, как я разместил свой вопрос... lindex $argv 0
- хорошая отправная точка; -)