Fullpath текущего TCL script

Есть ли возможность получить полный путь для текущего TCL script?

В PHP это будет: __FILE__

Ответы

Ответ 1

Вы хотите $argv0

Ответ 2

В зависимости от того, что вы подразумеваете под "выполнением TCL script", вы можете действительно искать info script или, возможно, даже info nameofexecutable или что-то более эзотерическое.

Ответ 3

Правильный способ получить имя файла, в котором находится текущий оператор, - это (настоящий эквивалент PHP/С++ __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 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

Ответ 4

Вы можете использовать [file normalize] для получения полностью нормализованного имени.

file normalize $argv0
file normalize [info nameofexecutable]

Ответ 5

секунд после того, как я разместил свой вопрос... lindex $argv 0 - хорошая отправная точка; -)