Полный путь текущего сценария TCL - PullRequest
13 голосов
/ 01 октября 2010

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

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

Ответы [ 5 ]

15 голосов
/ 01 октября 2010

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

13 голосов
/ 12 июня 2014

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

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

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

  1. set thisFile <value>: устанавливает переменную thisFile в value
  2. dict get <dict> file: возвращает значение файла из dict
  3. 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

7 голосов
/ 01 октября 2010

Вы хотите $argv0

4 голосов
/ 01 октября 2010

Вы также можете использовать [нормализация файла], чтобы получить полностью нормализованное имя.

file normalize $argv0
file normalize [info nameofexecutable]
0 голосов
/ 01 октября 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...