2010-10-01 8 views

उत्तर

7

आप $argv0

+0

जैसी सूची होगी, या तो argv0 को वैश्विक के रूप में परिभाषित करें, या पूरी तरह से इसे '$ :: argv0' –

+3

के रूप में योग्य बनाएं ध्यान दें कि वैश्विक 'argv0' चर tclsh और इच्छा (और tclkit भी) की एक विशेषता है और सामान्य रूप से टीसीएल की नहीं है। हालांकि यह बहुत आम है; समर्थन समारोह 'Tcl_Main' आपके लिए लागू करता है ... –

-2

सेकंड के बाद मैं अपने प्रश्न पोस्ट किया है ... lindex $argv 0 एक अच्छा प्रारंभिक बिंदु ;-)

+5

मुझे लगता है कि आप उस के साथ निराश हो जाएगा। फ़ाइल नाम के बाद आपको पहला तर्क मिलेगा। यदि आप "tclsh foo.tcl एक दो" करते हैं तो argv एक प्रक्रिया से पहुंचने पर ["एक" "दो"] –

15

चाहते है कि तुम क्या है पर निर्भर करता है इसका मतलब है "वर्तमान में टीसीएल स्क्रिप्ट निष्पादित करना", आप वास्तव में info script, या संभवतः info nameofexecutable या कुछ और गूढ़ खोज सकते हैं।

4

आप पूरी तरह सामान्यीकृत नाम प्राप्त करने के लिए [फ़ाइल सामान्यीकृत] का भी उपयोग कर सकते हैं।

file normalize $argv0 
file normalize [info nameofexecutable] 
11

फ़ाइल है कि मौजूदा बयान में रहता है के नाम को पुनः प्राप्त करने का सही तरीका, यह है (करने के लिए एक सच्चे बराबर PHP/सी ++ के __FILE__):

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

Psuedocode (यह कैसे काम करता है) :

  1. set thisFile <value>: सेट value
  2. dict get <dict> file चर thisFile : रिटर्न एक dict
  3. info frame <#> से फाइल मूल्य: निर्दिष्ट ढेर स्तर (#) पर फ्रेम के बारे में जानकारी के साथ एक dict देता है, और 0 सबसे हाल ही में ढेर फ्रेम वापस आ जाएगी नोटिस: अधिक जानकारी के लिए पोस्ट के अंत देखें जानकारी फ्रेम पर।

इस मामले में, file मूल्य info frame से लौटे, पहले से ही सामान्यीकृत हैं, इसलिए file normalize <path> की जरूरत नहीं है।

info script और info frame के बीच का अंतर मुख्य रूप से टीसीएल पैकेज के साथ उपयोग के लिए है। यदि info script का उपयोग एक टीसीएल फ़ाइल में किया गया था जिसे पैकेज की आवश्यकता होती है (require package <name>), तो info script वर्तमान में निष्पादित टीसीएल स्क्रिप्ट के पथ को वापस कर देगा और टीसीएल फ़ाइल का वास्तविक नाम प्रदान नहीं करेगा जिसमें info script कमांड शामिल है; हालांकि, यहां प्रदान किए गए info frame उदाहरण में फ़ाइल के फ़ाइल नाम को सही ढंग से वापस कर दिया जाएगा जिसमें कमांड शामिल है।

यदि आप चाहते हैं स्क्रिप्ट का नाम वर्तमान में मूल्यांकन किया जा रहा है, तो:

set sourcedScript [ info script ] 

आप स्क्रिप्ट (या दुभाषिया) के नाम पर चाहते हैं कि शुरू में लागू किया गया था, तो:

set scriptAtInvocation $::argv0 

आप निष्पादन योग्य है कि शुरू में लागू किया गया था, तो के नाम करना चाहते हैं:

set exeAtInvocation [ info nameofexecutable ] 

अद्यतन - विवरण के बारे में: info frame

यहां टीसीएल के भीतर एक स्टैकट्रैक दिखता है। frame_index हमें दिखा रहा है कि info frame $frame_index0 से [ 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

'जानकारी फ्रेम 0' लंबे समय तक 'जानकारी फ्रेम [जानकारी फ्रेम]' के बजाय पर्याप्त होना चाहिए। शून्य वर्तमान फ्रेम को संदर्भित करता है जबकि तर्क के बिना आंतरिकतम 'जानकारी फ्रेम' वर्तमान फ्रेम की संख्या वापस कर देगा। – cfi

+0

हाय @ सीएफआई, यह थोड़ा सा अंतर्ज्ञानी है, लेकिन [जानकारी फ्रेम] वास्तव में 1 से शुरू होता है और [जानकारी फ्रेम] पर जाता है। 1 मूल कॉल और [जानकारी फ्रेम] सबसे हालिया कॉल है। हालांकि, यदि आप जानकारी फ्रेम में 0 पास करते हैं, तो आपको [जानकारी फ्रेम [जानकारी फ्रेम]] के बराबर मिलता है, जो सबसे हालिया कॉल है। – nikc

संबंधित मुद्दे