2010-10-01 16 views

Odpowiedz

7

Chcesz $argv0

+0

, jeśli uzyskasz dostęp do procedury, zdefiniuj argv0 jako globalną lub całkowicie zakwalifikuj ją jako '$ :: argv0' –

+3

Zauważ, że globalna zmienna 'argv0' jest cechą tclsh i wish (i tclkit też), a nie Tcl w ogóle. Jest to bardzo często; funkcja wsparcia 'Tcl_Main' implementuje je dla ciebie ... –

-2

sekund po tym, jak zostały zaksięgowane na moje pytanie ... lindex $argv 0 jest dobrym punktem wyjścia ;-)

+5

myślę będziesz rozczarowany z tego. Dostaniesz pierwszy argument za nazwą pliku. Jeśli zrobisz "tclsh foo.tcl jeden dwa" argv będzie listą, na przykład ["jeden" "dwa"] –

15

zależności od tego co to znaczy, że "obecnie wykonuje skrypt TCL", możesz rzeczywiście poszukać info script, a może nawet info nameofexecutable lub czegoś bardziej ezoterycznego.

4

Możesz użyć [plik normalize], aby uzyskać w pełni znormowaną nazwę.

file normalize $argv0 
file normalize [info nameofexecutable] 
11

Poprawny sposób, aby pobrać nazwę pliku, który znajduje się w bieżącym stwierdzenie, czy to (prawdziwy odpowiednik PHP/C++ 's __FILE__):

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

Psuedocode (jak to działa) :

  1. set thisFile <value>: ustawia zmienną tenplik do value
  2. dict get <dict> file : Zwraca wartość plik z dict
  3. info frame <#>: zwraca dict z informacjami o ramie przy określonym poziomie stosu (#), a 0 powróci najnowszej ramce stosu Uwaga: Patrz koniec postu, aby uzyskać więcej informacji na ramce informacyjnej.

W tym przypadku wartość file wrócił z info frame jest już znormalizowane, więc file normalize <path> w nie potrzebne.

Różnica między info script i info frame jest głównie do użytku z pakietami Tcl. Jeśli użyto info script w pliku Tcl, który został dostarczony w czasie trwania żądania pakietu (require package <name>), to zwróciłby ścieżkę do aktualnie wykonywanego skryptu Tcl i nie podałby rzeczywistej nazwy pliku Tcl, który zawierałby komendę info script; Jednak dostarczony tutaj przykład info frame poprawnie zwróci nazwę pliku, który zawiera polecenie.

Jeśli chcesz nazwa skryptu obecnie oceniany, a następnie:

set sourcedScript [ info script ] 

Jeśli chcesz nazwę skryptu (lub tłumacza), który początkowo był wywoływany, a następnie:

set scriptAtInvocation $::argv0 

Jeśli chcesz nazwę pliku wykonywalnego, który pierwotnie został wywołany, a następnie:

set exeAtInvocation [ info nameofexecutable ] 

UPDATE - Szczegółowe informacje: info frame

Oto, jak wygląda stacktrace w Tcl. frame_index pokazuje nam, jak wygląda info frame $frame_index dla wartości od 0 do [ info frame ].

Zadzwoń pod numer info frame [ info frame ] jest funkcjonalnie równoważny info frame 0, ale używanie 0 jest oczywiście szybsze.

Występują tylko 1 do [ info frame ] klatek stosu, a 0 zachowuje się jak [ info frame ]. W tym przykładzie widać, że 0 i 5 (co jest [ info frame ]) są takie same:

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 

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

+0

Bardzo przydatne, dziękuję! –

+0

'ramka informacyjna 0' powinna wystarczyć zamiast dłuższej' ramki informacyjnej [ramki informacyjnej] '. Wartość zero odnosi się do bieżącej klatki, natomiast najbardziej wewnętrzna "ramka informacji" bez argumentów zwróci numer bieżącej klatki. – cfi

+0

Hi @ cfi, to trochę kontuar intuicyjny, ale [info frame] naprawdę zaczyna się od 1 i przechodzi do [info frame]. 1 oznacza połączenie inicjujące, a [ramka informacyjna] jest ostatnim połączeniem. Jeśli jednak wpiszesz 0 w ramkę informacyjną, otrzymasz odpowiednik [ramka informacyjna [ramka informacyjna]], która jest ostatnią rozmową. – nikc

Powiązane problemy