Полный путь текущего сценария TCL

Есть ли возможность получить полный путь к исполняемому в настоящее время сценарию TCL?

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

Ответы на вопрос(5)

в котором находится текущий оператор, заключается в следующем (истинный эквивалент PHP / C ++__FILE__):

set thisFile [ dict get [ info frame 0 ] file ]

Psuedocode (как это работает):

set thisFile <value> : устанавливает переменную thisFile вvaluedict 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 и не предоставит фактическое имя файла 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

 nikc05 мая 2016 г., 22:11
@cfi, честно. Я обновил пост.
 Gerhard Burger12 июн. 2015 г., 17:03
очень полезно, спасибо!
 cfi02 мая 2016 г., 08:48
@nikc: Именно моя точка зрения ;-)
 nikc30 апр. 2016 г., 13:52
Привет @cfi, это немного противоречит интуиции, но [информационный фрейм] действительно начинается с 1 и переходит в [информационный фрейм]. 1 - исходящий вызов, а [информационный фрейм] - самый последний вызов. Однако, если вы передадите 0 в информационный фрейм, вы получите эквивалент [информационного фрейма [инфо-фрейма]], который является самым последним вызовом.
 cfi28 апр. 2016 г., 11:22
info frame 0 должно хватить вместо дольшеinfo frame [ info frame ], Ноль относится к текущему кадру, тогда как самый внутреннийinfo frame без аргументов вернул бы номер текущего кадра.

чтобы получить полностью нормализованное имя.

file normalize $argv0
file normalize [info nameofexecutable]

что вы подразумеваете под «выполняемым в настоящее время сценарием TCL», вы можете искатьinfo scriptили, возможно, дажеinfo nameofexecutable или что-то более эзотерическое.

Решение Вопроса
 Donal Fellows01 окт. 2010 г., 22:56
Обратите внимание, что глобальныйargv0 Переменная - это свойство tclsh и wish (и tclkit тоже), а не Tcl в целом. Это очень распространено, хотя; функция поддержкиTcl_Main реализует это для вас ...
 Bryan Oakley01 окт. 2010 г., 22:26
если доступ осуществляется из процедуры, либо определите argv0 как глобальный, либо полностью определите его как$::argv0

lindex $argv 0 хорошая отправная точка ;-)

 Bryan Oakley01 окт. 2010 г., 22:25
Я думаю, вы будете разочарованы этим. Вы получите первый аргумент после имени файла. Если вы выполните "tclsh foo.tcl one two", argv будет выглядеть как ["one" "two"]

Ваш ответ на вопрос