2010-10-01 50 views

Trả lời

7

Bạn muốn $argv0

+0

nếu truy cập từ một quy trình, hoặc xác định argv0 là toàn cầu hoặc hoàn toàn đủ điều kiện là '$ :: argv0' –

+3

Lưu ý rằng biến 'argv0' toàn cầu là một tính năng của tclsh và wish (và tclkit) và không phải của Tcl nói chung. Nó rất phổ biến mặc dù; chức năng hỗ trợ 'Tcl_Main' thực hiện nó cho bạn ... –

-2

giây sau khi tôi đã đăng câu hỏi của tôi ... lindex $argv 0 là một điểm khởi đầu tốt ;-)

+5

Tôi nghĩ rằng bạn sẽ phải thất vọng với điều đó. Bạn sẽ nhận được đối số đầu tiên sau tên tệp. Nếu bạn làm "tclsh foo.tcl một hai" argv sẽ là một danh sách như ["one" "two"] –

15

Tùy thuộc vào những gì bạn có nghĩa là "hiện đang thực thi tập lệnh TCL", bạn có thể thực sự tìm kiếm info script hoặc thậm chí có thể là info nameofexecutable hoặc một điều gì đó bí truyền hơn.

4

Bạn cũng có thể sử dụng [bình thường hóa] để nhận tên được chuẩn hóa hoàn toàn.

file normalize $argv0 
file normalize [info nameofexecutable] 
11

Các cách chính xác để lấy tên của tập tin rằng tuyên bố hiện tại nằm trong, là này (tương đương đúng với PHP/C++ 's __FILE__):

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

psuedocode (làm thế nào nó hoạt động) :

  1. set thisFile <value>: đặt thisFile biến để value
  2. dict get <dict> file : Trả về giá trị tập tin từ một dict
  3. info frame <#>: trả về một dict với thông tin về khung ở cấp đống quy định (#), và 0 sẽ trả lại stack frame mới nhất THÔNG BÁO: Xem cuối bài để biết thêm thông tin trên khung thông tin.

Trong trường hợp này, giá trị file trở về từ info frame đã bình thường hóa, vì vậy file normalize <path> trong không cần thiết.

Sự khác biệt giữa info scriptinfo frame chủ yếu để sử dụng với Gói Tcl. Nếu info script được sử dụng trong tệp Tcl được cung cấp theo yêu cầu (require package <name>), thì info script sẽ trả lại đường dẫn đến tập lệnh Tcl hiện đang thực thi và sẽ không cung cấp tên thực tế của tệp Tcl chứa lệnh info script; Tuy nhiên, ví dụ info frame được cung cấp ở đây sẽ trả về tên tệp của tệp chứa lệnh đó một cách chính xác.

Nếu bạn muốn tên của kịch bản hiện đang được đánh giá, sau đó:

set sourcedScript [ info script ] 

Nếu bạn muốn tên của kịch bản (hoặc thông dịch viên) mà ban đầu được gọi, sau đó:

set scriptAtInvocation $::argv0 

Nếu bạn muốn tên của tập tin thực thi ban đầu được gọi, sau đó:

set exeAtInvocation [ info nameofexecutable ] 

CẬP NHẬT - Chi tiết về: info frame

Dưới đây là hình thức của một chồng xếp trong Tcl. Các frame_index là hiển thị cho chúng tôi những gì info frame $frame_index trông giống như cho các giá trị từ 0 đến [ info frame ].

Gọi info frame [ info frame ] có chức năng tương đương với info frame 0, nhưng việc sử dụng 0 tất nhiên sẽ nhanh hơn.

Chỉ thực sự 1 đến [ info frame ] khung ngăn xếp và 0 hoạt động như [ info frame ]. Trong ví dụ này, bạn có thể thấy rằng 05 (đó là [ info frame ]) đều giống nhau:

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 

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

+0

cực kỳ hữu ích, cảm ơn bạn! –

+0

'khung thông tin 0' phải đủ thay vì khung thông tin' dài hơn [khung thông tin] '. Số không đề cập đến khung hiện tại trong khi 'khung thông tin' bên trong nhất định không có đối số sẽ trả về số của khung hiện tại. – cfi

+0

Hi @ cfi, đây là một bộ đếm nhỏ trực quan, nhưng [khung thông tin] thực sự bắt đầu bằng 1 và đi tới [khung thông tin]. 1 là cuộc gọi ban đầu và [khung thông tin] là cuộc gọi gần đây nhất. Tuy nhiên, nếu bạn chuyển 0 vào khung thông tin, thì bạn sẽ nhận được tương đương với [khung thông tin [khung thông tin]], đây là cuộc gọi gần đây nhất. – nikc

Các vấn đề liên quan