2011-05-11 4 views
5

कहें कि मैं रनटाइम को निष्पादन के आउटपुट को प्रिंट करके एक स्क्रिप्ट या निष्पादन योग्य फ़ाइल निष्पादित करना चाहता हूं।टीसीएल - स्क्रीन वें संदेशों पर प्रिंट कैसे करें जहां निष्पादन आदेश के निष्पादन के दौरान मुद्रित किया गया था?

जब मैं कार्य करें:

set log [exec ./executable_file] 
puts $log 

तो यह एक लंबे समय के इंतजार कर रहा है और उसके बाद बार में सब कुछ प्रिंट करता है। लेकिन मुझे रनटाइम प्रिंटिंग चाहिए। मैं यह कैसे कर सकता हूँ?

उत्तर

8

सही नहीं है (यह बाहरी फ़ाइल के लिए लिख की आवश्यकता के रूप में):

set log [exec executable_file | tee log.txt >@stdout] 

उत्पादन तुरंत प्रदर्शित किया जाएगा, एक ही समय में, 'log.txt' में सहेजा गया। यदि आपको आउटपुट को सहेजने की परवाह नहीं है:

set log [exec executable_file >@stdout] 
+2

+1: ध्यान दें कि पाइपलाइन में कमांड चलाने से उसका बफरिंग व्यवहार बदल सकता है; उम्मीद स्क्रिप्ट 'unbuffer' उस के साथ मदद कर सकते हैं। –

0

हो सकता है आप अपने निष्पादन से पहले पृष्ठभूमि में किसी अन्य प्रक्रिया शुरू कर सकते हैं, पूंछ -f logfile.txt की तरह है, और इस logfile.txt में अपने निष्पादन के परिणामों outputting?

+0

तो रनटाइम पाने का कोई तरीका नहीं है? – Narek

2

उपयोग open "| ..." और asyncronous linewise लौटे वर्णनकर्ता से पढ़ने, इस तरह:

proc ReadLine fd { 
    if {[gets $fd line] < 0} { 
    if {[chan eof $fd]} { 
     chan close $fd 
     set ::forever now 
     return 
    } 
    } 
    puts $line 
} 

set fd [open "| ./executable_file"] 
chan configure $fd -blocking no 
chan event $fd readable [list ReadLine $fd] 

vwait forever 

अधिक शामिल उदाहरण के लिए this wiki page देखें।

एक वास्तविक कार्यक्रम में आपके पास शायद पहले से ही एक ईवेंट लूप चल रहा है, इसलिए vwait को एक कमांड के आउटपुट को पढ़ने के लिए विशिष्ट आवश्यकता नहीं होगी।

यदि आपको आउटपुट इकट्ठा करने की आवश्यकता है, तो केवल [puts] प्रत्येक पंक्ति को पढ़ने के बाद नहीं, आपको वैश्विक रूप से एक वैश्विक (आमतौर पर नामित) चर बनाने की आवश्यकता होगी, इसे "" शुरू करने के लिए आरंभ करें, अपना नाम अन्य तर्क के रूप में पास करें कॉलबैक प्रक्रिया (ReadLine यहां) और उस चर के मान को लाइन संलग्न करें।

+0

यदि आप आउटपुट एकत्र नहीं कर रहे हैं, तो सबप्रोसेस को सीधे stdout से कनेक्ट करना बेहतर है। –

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