2010-10-06 13 views
8

मैं 1 कमांड के आउटपुट को एक चर में रीडायरेक्ट करना चाहता हूं, जहां OUTPUT आमतौर पर STDOUT होता है। मैं एक ईडीए उपकरण चला रहा हूं, जिसमें टीसीएल इंटरपेटर & है, यह अपने स्वयं के आदेश हैं।tcl कमांड एक चर के लिए रीडायरेक्ट करता है, tcl संस्करण 8.4

TOOL> set ret redirect {find_transistor m*} 
TOOL> puts $ret 
m1 m2 m3 m4 

कोई भी विचार: चलो कहते हैं कि उपकरण एक tcl क्वेरी का कहना है कि जो

TOOL> find_transistor m* 
m1 m2 m3 m4 

मैं निम्नलिखित करने का एक तरीका करना चाहते है कि करते हैं?

+0

आपको लगता है कि find_transistor प्रिंट stdout करने के लिए कुछ कर रहे हैं, या आप कर रहे हैं यह मानते हुए कि आपके इंटरैक्टिव अनुभव के आधार पर? –

उत्तर

3
शुद्ध Tcl

में अच्छी तरह से

set ret [find_transistor m*] 

शायद आप क्या चाहते हैं करना होगा। Tcl tutorial पढ़ने का प्रयास करें। मन में

find_transistor m* > tmp 
set fp [open "tmp" r] 
set file_data [read $fp] 
close $fp 

भालू है कि आदेश के उत्पादन में अपेक्षाकृत छोटे होना चाहिए:

+5

यह काम नहीं करेगा अगर "find_transistor" stdout पर इसके परिणाम लिखता है। आपका पूरा उदाहरण जो भी 'find_transistor' रिटर्न बचाता है, दुर्भाग्य से सवाल नहीं पूछ रहा है। –

+1

आप निश्चित रूप से सही हैं - अगर आदेश वास्तव में STDOUT को लिख रहा है तो एक अलग दृष्टिकोण की आवश्यकता होगी। हमें वापस आने और हमसे बात करने के लिए वास्तव में प्रश्न के उत्प्रेरक की आवश्यकता है! – Jackson

+0

मैं प्रश्न का उत्प्रेरक नहीं हूं, लेकिन मुझे एक ही समस्या का सामना करना पड़ा। [] कुछ ईडीए उपकरण आंतरिक आदेशों के लिए काम नहीं करेगा और वे आदेश STDOUT को संदेश प्रिंट करते हैं। कोई उपाय? – solotim

0

इससे पहले कि किसी को भी एक सुरुचिपूर्ण समाधान के साथ आता है, मैं अपने बदसूरत अंतिम उपाय को साझा करें।

+0

यह सादे टीसीएल 8.4 में काम नहीं करता है। हालांकि मुझे लगता है कि यह मूल पूछताछ और यहां आने वाले बहुत से लोगों के लिए समस्या को हल करता है, क्योंकि कई ईडीए उपकरण आउटपुट पुनर्निर्देशन जैसे खोल को लागू करते हैं। सादा टीसीएल 'गलत> तर्कों के साथ' test> f1' पर चकित होगा: "परीक्षण" होना चाहिए यदि 'proc test {} {puts" हाय, वहां! " } ' – cfi

4

यह काम हो सकता है: आपके आवेदन एक redirect आदेश नहीं है

redirect -variable ret {find_transistor m*} 

puts $ret 
+4

अच्छा, यह केवल कंपनी Synopsys के उपकरण के लिए काम करता है। शायद यह अभी भी एक अच्छा जवाब है, भले ही यह मूल प्रश्न का उत्तर न दे। कम से कम यह यहां आने वाले बहुत से लोगों के लिए इस मुद्दे को हल करता है। हालांकि 'रीडायरेक्ट' एक सादा टीसीएल कमांड नहीं है, और इस प्रकार सादा टीसीएल में काम नहीं करता है, और किसी अन्य टीसीएल आधारित ईडीए उपकरण में बहुत ही असंभव है। – cfi

2

हैं, तो आप अपने खुद के बना सकते हैं।

my answer पर general question of how to redirect in plain Tcl पर एक नज़र डालें?

एक चर में पुन: निर्देशित करना कर सकता है:

proc redirect_variable {varname cmd} { 
    rename puts ::tcl::orig::puts 

    global __puts_redirect 
    set __puts_redirect {} 

    proc puts args { 
     global __puts_redirect 
     set __puts_redirect [concat $__puts_redirect [lindex $args end]] 
     set args [lreplace $args end end] 
     if {[lsearch -regexp $args {^-nonewline}]<0} { 
      set __puts_redirect "$__puts_redirect\n" 
     } 
     return 
    } 

    uplevel $cmd 

    upvar $varname destination 
    set destination $__puts_redirect 
    unset __puts_redirect 

    rename puts {} 
    rename ::tcl::orig::puts puts 
} 
0

सबसे आसान तरीका मैंने पाया कार्यकारी है: सेट वीएआर [कार्यकारी COMMAND]