2010-11-07 14 views
5

बैश कमांड एक इंटरैक्टिव tclsh सत्र से उपलब्ध हैं। जैसे (अर्थात exec के बिना) एक tclsh सत्र में आप कर सकते हैंtcl स्क्रिप्ट से बैश कमांड कैसे कॉल करें?

% ls 

बजाय

$ exec ls 

लेकिन, आप नहीं कर सकते एक tcl स्क्रिप्ट जो बैश कॉल सीधे आदेश देता है।

टीसीएल स्क्रिप्ट फ़ाइलों को समझते समय मैं बैश कमांड को पहचानने के लिए tclsh कैसे बना सकता हूं, जैसा कि यह एक इंटरैक्टिव सत्र में करता है?

मुझे लगता है कि कुछ टीसीएल पैकेज (या ऐसा कुछ) है, जिसे बैश कॉमन्स की सीधी कॉल का समर्थन करने के लिए एक इंटरैक्टिव सत्र लॉन्च करते समय स्वचालित रूप से लोड किया जा रहा है। मैं इसे tcl स्क्रिप्ट फ़ाइलों में मैन्युअल रूप से लोड कैसे कर सकता हूं?

उत्तर

7

यहाँ क्या हो रहा है कि unknown proc जब आप ls की तरह एक आदेश लिखें शुरू हो जाती है हो रही है, क्योंकि वह एक मौजूदा tcl आदेश नहीं है, और डिफ़ॉल्ट रूप से, कि आदेश की जाँच करेगा है कि आदेश एक इंटरैक्टिव सत्र से लागू किया गया था, तो और शीर्ष-स्तर (अप्रत्यक्ष रूप से एक प्रो बॉडी में) से और यह जांचने की जांच कर रहा है कि पथ का नाम पथ पर कहीं मौजूद है या नहीं। आप अपनी खुद की प्रक्रिया अज्ञात लिखकर ऐसा कुछ प्राप्त कर सकते हैं।

इस पर एक अच्छी शुरुआत के लिए,

info body unknown 
+3

+1: यह निशान की शुरुआत है, लेकिन मेरा मानना ​​है कि इससे खराब कोड होता है। 'Exec' कॉल करने के लिए बेहतर स्पष्ट IMO ... –

+0

@Donal: हाँ, मैं सहमत हूं। स्पष्ट रूप से स्पष्ट है, और मैं वास्तव में अज्ञात proc को फिर से लिखने की सलाह नहीं दूंगा, या इससे पहले कि कुछ भी मौजूद हो, सिवाय इसके कि पहले से मौजूद ऑटोलोड लोड कार्यक्षमता को बढ़ाया जा सके। – SingleNegationElimination

4

एक बात आपको जाननी चाहिए कि ls एक बैश कमांड नहीं है। यह एक स्टैंडअलोन उपयोगिता है। इस तरह की उपयोगिताओं को कैसे चलाता है इसके लिए सुराग उसके नाम पर है - sh का मतलब है "खोल"। तो यह बैश के बराबर बराबर है कि बैश भी एक खोल है। Tcl! = Tclsh ताकि आपको exec का उपयोग करना पड़े।

10

के आउटपुट का परीक्षण आप, विशिष्ट उपयोगिताओं अपनी स्क्रिप्ट में उपलब्ध है ब्रिजिंग प्रक्रियाओं लिखने के लिए करना चाहते हैं:

proc ls args { 
    exec {*}[auto_execok ls] {*}$args 
} 

कि भी होगा अधिकांश शैल बिल्टिन या विंडोज़ के लिए काम (स्पष्ट अनुकूलन के साथ)। (निष्पक्ष होने के लिए, आप आमतौर पर बाहरी ls का उपयोग नहीं करना चाहते हैं; आंतरिक glob कमांड आमतौर पर कुछ file उप-सामग्रियों से अतिरिक्त सहायता के साथ पर्याप्त होता है।) कुछ आदेशों को थोड़ा और काम की आवश्यकता होती है (उदाहरण के लिए, इनपुट को पुनर्निर्देशित करना ताकि यह आता है एक अतिरिक्त <@stdin या </dev/tty के साथ टर्मिनल; कुछ प्लेटफॉर्म पर stty के लिए इसकी आवश्यकता है) लेकिन यह उचित रूप से अच्छी तरह से काम करता है।

हालांकि, यदि आप जो भी मांग रहे हैं, वह बाह्य कार्यक्रमों के बिना किसी अतिरिक्त कोड के मनमाने ढंग से निष्पादन करना है, यह चिह्नित करने के लिए कि वे बाहरी हैं, जिसे टीसीएल के आचारों के खिलाफ माना जाता है। मुद्दा यह है कि यह कोड को बनाए रखने के लिए काफी कठिन बनाता है; यह स्पष्ट नहीं है कि आप कुछ (अपेक्षाकृत) सस्ते का उपयोग करने के बजाय एक महंगी कॉल-आउट कर रहे हैं जो आंतरिक है। उस मामले में exec में डालकर खतरनाक है ...

+1

तर्कसंगत रूप से, यह सिर्फ टीसीएल के आचारों के खिलाफ नहीं है, यह सामान्य रूप से केवल खराब प्रोग्रामिंग भी है। –

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