Czy istnieje możliwość uzyskania pełnej ścieżki aktualnie wykonywanego skryptu TCL?Pełna ścieżka bieżącego skryptu TCL
W PHP byłoby: __FILE__
Czy istnieje możliwość uzyskania pełnej ścieżki aktualnie wykonywanego skryptu TCL?Pełna ścieżka bieżącego skryptu TCL
W PHP byłoby: __FILE__
Chcesz $argv0
sekund po tym, jak zostały zaksięgowane na moje pytanie ... lindex $argv 0
jest dobrym punktem wyjścia ;-)
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"] –
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.
Możesz użyć [plik normalize], aby uzyskać w pełni znormowaną nazwę.
file normalize $argv0
file normalize [info nameofexecutable]
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) :
set thisFile <value>
: ustawia zmienną tenplik do value
dict get <dict> file
: Zwraca wartość plik z dictinfo 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
Bardzo przydatne, dziękuję! –
'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
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
, jeśli uzyskasz dostęp do procedury, zdefiniuj argv0 jako globalną lub całkowicie zakwalifikuj ją jako '$ :: argv0' –
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 ... –