2010-10-01 16 views

Respuesta

7

¿Quieres $argv0

+0

si accede desde un procedimiento, defina argv0 como global o califíquelo como '$ :: argv0' –

+3

Tenga en cuenta que la variable global 'argv0' es una característica de tclsh y wish (y tclkit también) y no de Tcl en general. Es muy común sin embargo; la función de soporte 'Tcl_Main' lo implementa para usted ... –

-2

segundos después de haber publicado mi pregunta ... lindex $argv 0 es un buen punto de partida ;-)

+5

pienso que usted estará decepcionado con eso. Obtendrá el primer argumento después del nombre del archivo. Si "tclsh foo.tcl one two" argv será una lista como ["uno" "dos"] –

15

Dependiendo de lo que significa "actualmente ejecutando script TCL", en realidad podría buscar info script, o posiblemente incluso info nameofexecutable o algo más esotérico.

4

Puede usar [file normalize] para obtener el nombre completamente normalizado, también.

file normalize $argv0 
file normalize [info nameofexecutable] 
11

La forma correcta para recuperar el nombre del archivo que el estado de cuenta actual reside en, es la siguiente (un verdadero equivalente a PHP/C++ 's __FILE__):

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

psuedocode (cómo funciona) :

  1. set thisFile <value>: establece thisFile variable para value
  2. dict get <dict> file : Devuelve el valor de archivo de un dict
  3. info frame <#>: devuelve un diccionario con información sobre el marco en el nivel de pila especificada (#), y 0 devolverá el marco de pila más reciente AVISO: Consulte final del post para más información en el marco de información.

En este caso, el valor file regresar de info frame es ya normalizada, por lo file normalize <path> No es necesario.

La diferencia entre info script y info frame es principalmente para usar con los paquetes de Tcl. Si se usó info script en un archivo Tcl que se proporcionó durante un paquete requerido (require package <name>), entonces info script devolvería la ruta al script Tcl que se está ejecutando actualmente y no proporcionaría el nombre real del archivo Tcl que contenía el comando info script; Sin embargo, el ejemplo info frame proporcionado aquí devolverá correctamente el nombre de archivo del archivo que contiene el comando.

Si desea que se evalúa el nombre del script que se está, entonces:

set sourcedScript [ info script ] 

Si desea que el nombre de la secuencia de comandos (o intérprete) que se invoca inicialmente, entonces:

set scriptAtInvocation $::argv0 

Si desea que el nombre del archivo ejecutable que se invoca inicialmente, entonces:

set exeAtInvocation [ info nameofexecutable ] 

ACTUALIZACIÓN - Detalles acerca de: info frame

Esto es lo que parece un stacktrace en Tcl. El frame_index es el que nos muestra cómo se ve info frame $frame_index para los valores de 0 hasta [ info frame ].

Llamar a info frame [ info frame ] es funcionalmente equivalente a info frame 0, pero usar 0 es, por supuesto, más rápido.

Sólo hay realidad 1 a [ info frame ] marcos de pila, y se comporta como 0[ info frame ]. En este ejemplo se puede ver que 0 y 5 (que es [ info frame ]) son los mismos:

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 

Ver: https://github.com/Xilinx/XilinxTclStore/blob/master/tclapp/xilinx/profiler/app.tcl#L273

+0

extremadamente útil, ¡gracias! –

+0

'marco de información 0' debería ser suficiente en lugar del marco de información más largo [marco de información]'. El cero se refiere al marco actual mientras que el 'marco de información' más interno sin argumentos devolvería el número del cuadro actual. – cfi

+0

Hola @cfi, este es un pequeño contador intuitivo, pero [info frame] realmente comienza con 1 y va a [info frame]. 1 es la llamada de origen y [marco de información] es la llamada más reciente. Sin embargo, si pasa 0 al marco de información, obtiene el equivalente de [info frame [info frame]], que es la llamada más reciente. – nikc

Cuestiones relacionadas