Есть ли возможность получить полный путь к выполняемому в настоящее время TCL-скрипту?Fullpath текущего сценария TCL
В PHP это будет: __FILE__
Есть ли возможность получить полный путь к выполняемому в настоящее время TCL-скрипту?Fullpath текущего сценария TCL
В PHP это будет: __FILE__
Вы хотите $argv0
секунд после того, как я отправил свой вопрос ... lindex $argv 0
является хорошей отправной точкой ;-)
Я думаю, что вы будете разочарованы с этим. После имени файла вы получите первый аргумент. Если вы делаете «tclsh foo.tcl один два», argv будет списком, например [«один» «два»] –
В зависимости от того, что означает, что «в настоящее время выполняется сценарий TCL», вы можете действительно искать info script
или, возможно, даже info nameofexecutable
или что-то более эзотерическое.
Вы также можете использовать [file normalize], чтобы получить полностью нормализованное имя.
file normalize $argv0
file normalize [info nameofexecutable]
Правильный способ получить имя файла, текущий оператор проживает в, это (истинный эквивалент PHP/C++ 's __FILE__
):
set thisFile [ dict get [ info frame 0 ] file ]
Psuedocode (как это работает) :
set thisFile <value>
: устанавливает переменную thisFile в value
dict get <dict> file
: Возвращает значение файла из Словареinfo 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
Вот что выглядит stacktrace в 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
чрезвычайно полезно, спасибо! –
'info frame 0' должно быть достаточным вместо более длинного' info frame [info frame] '. Нуль относится к текущему кадру, тогда как самый внутренний «информационный кадр» без аргументов возвращает номер текущего кадра. – cfi
Привет @cfi, это немного счетчик интуитивно понятный, но [info frame] действительно начинается с 1 и переходит в [info frame]. 1 является исходящим вызовом, а [info frame] является самым последним вызовом. Однако, если вы передадите 0 в информационный фрейм, вы получите эквивалент [info frame [info frame]], который является самым последним звонком. – nikc
, если вы используете процедуру, либо определяете argv0 как глобальную, либо полностью квалифицируете ее как «$ :: argv0» –
Обратите внимание, что глобальная переменная 'argv0' является функцией tclsh и wish (и tclkit), а не Tcl вообще. Это очень распространено; функция поддержки 'Tcl_Main' реализует ее для вас ... –