क्या वर्तमान में निष्पादित टीसीएल स्क्रिप्ट का पूरा पथ प्राप्त करने की संभावना है?वर्तमान टीसीएल स्क्रिप्ट का पूर्णपथ
PHP में यह होगा: __FILE__
क्या वर्तमान में निष्पादित टीसीएल स्क्रिप्ट का पूरा पथ प्राप्त करने की संभावना है?वर्तमान टीसीएल स्क्रिप्ट का पूर्णपथ
PHP में यह होगा: __FILE__
आप $argv0
सेकंड के बाद मैं अपने प्रश्न पोस्ट किया है ... lindex $argv 0
एक अच्छा प्रारंभिक बिंदु ;-)
मुझे लगता है कि आप उस के साथ निराश हो जाएगा। फ़ाइल नाम के बाद आपको पहला तर्क मिलेगा। यदि आप "tclsh foo.tcl एक दो" करते हैं तो argv एक प्रक्रिया से पहुंचने पर ["एक" "दो"] –
चाहते है कि तुम क्या है पर निर्भर करता है इसका मतलब है "वर्तमान में टीसीएल स्क्रिप्ट निष्पादित करना", आप वास्तव में info script
, या संभवतः info nameofexecutable
या कुछ और गूढ़ खोज सकते हैं।
आप पूरी तरह सामान्यीकृत नाम प्राप्त करने के लिए [फ़ाइल सामान्यीकृत] का भी उपयोग कर सकते हैं।
file normalize $argv0
file normalize [info nameofexecutable]
फ़ाइल है कि मौजूदा बयान में रहता है के नाम को पुनः प्राप्त करने का सही तरीका, यह है (करने के लिए एक सच्चे बराबर PHP/सी ++ के __FILE__
):
set thisFile [ dict get [ info frame 0 ] file ]
Psuedocode (यह कैसे काम करता है) :
set thisFile <value>
: सेट value
dict get <dict> file
चर thisFile : रिटर्न एक dictinfo 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_index
0
से [ 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' लंबे समय तक 'जानकारी फ्रेम [जानकारी फ्रेम]' के बजाय पर्याप्त होना चाहिए। शून्य वर्तमान फ्रेम को संदर्भित करता है जबकि तर्क के बिना आंतरिकतम 'जानकारी फ्रेम' वर्तमान फ्रेम की संख्या वापस कर देगा। – cfi
हाय @ सीएफआई, यह थोड़ा सा अंतर्ज्ञानी है, लेकिन [जानकारी फ्रेम] वास्तव में 1 से शुरू होता है और [जानकारी फ्रेम] पर जाता है। 1 मूल कॉल और [जानकारी फ्रेम] सबसे हालिया कॉल है। हालांकि, यदि आप जानकारी फ्रेम में 0 पास करते हैं, तो आपको [जानकारी फ्रेम [जानकारी फ्रेम]] के बराबर मिलता है, जो सबसे हालिया कॉल है। – nikc
जैसी सूची होगी, या तो argv0 को वैश्विक के रूप में परिभाषित करें, या पूरी तरह से इसे '$ :: argv0' –
के रूप में योग्य बनाएं ध्यान दें कि वैश्विक 'argv0' चर tclsh और इच्छा (और tclkit भी) की एक विशेषता है और सामान्य रूप से टीसीएल की नहीं है। हालांकि यह बहुत आम है; समर्थन समारोह 'Tcl_Main' आपके लिए लागू करता है ... –