2010-10-01 3 views

ответ

7

Вы хотите $argv0

+0

, если вы используете процедуру, либо определяете argv0 как глобальную, либо полностью квалифицируете ее как «$ :: argv0» –

+3

Обратите внимание, что глобальная переменная 'argv0' является функцией tclsh и wish (и tclkit), а не Tcl вообще. Это очень распространено; функция поддержки 'Tcl_Main' реализует ее для вас ... –

-2

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

+5

Я думаю, что вы будете разочарованы с этим. После имени файла вы получите первый аргумент. Если вы делаете «tclsh foo.tcl один два», argv будет списком, например [«один» «два»] –

15

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

4

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

file normalize $argv0 
file normalize [info nameofexecutable] 
11

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

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

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

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

+0

чрезвычайно полезно, спасибо! –

+0

'info frame 0' должно быть достаточным вместо более длинного' info frame [info frame] '. Нуль относится к текущему кадру, тогда как самый внутренний «информационный кадр» без аргументов возвращает номер текущего кадра. – cfi

+0

Привет @cfi, это немного счетчик интуитивно понятный, но [info frame] действительно начинается с 1 и переходит в [info frame]. 1 является исходящим вызовом, а [info frame] является самым последним вызовом. Однако, если вы передадите 0 в информационный фрейм, вы получите эквивалент [info frame [info frame]], который является самым последним звонком. – nikc

Смежные вопросы