2010-10-06 6 views
8

Desidero reindirizzare l'output di 1 comando a una variabile, in cui OUTPUT è in genere in STDOUT. Sono in esecuzione uno strumento EDA, che ha tcl interpeter & propri comandi. Diciamo che lo strumento ha una query tcl, che diceil comando tcl reindirizza a una variabile, la versione tcl è 8.4

TOOL> find_transistor m* 
m1 m2 m3 m4 

voglio avere un modo di fare quanto segue:

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

Tutte le idee?

+0

Siete certi che le stampe find_transistor a stdout, o sei supponendo che sia basato sulla tua esperienza interattiva? –

risposta

3

bene in puro Tcl

set ret [find_transistor m*] 

sarebbe probabilmente fare quello che vuoi. Prova a leggere il Tcl tutorial.

+5

Questo non funzionerà se "find_transistor" scrive il suo risultato su stdout. Tutto il tuo esempio è salvare qualunque cosa ritorni "find_transistor', che purtroppo non è ciò che la domanda sta ponendo. –

+1

Ovviamente sei corretto: se il comando in realtà sta scrivendo su STDOUT, sarà necessario un approccio diverso. Abbiamo davvero bisogno che l'autore della domanda torni e ci parli! – Jackson

+0

Non sono l'autore della domanda, ma ho riscontrato lo stesso problema. [] non funzionerà con alcuni comandi interni dello strumento EDA e questi comandi stampano i messaggi su STDOUT. Qualche suggerimento? – solotim

0

Prima che qualcuno esce con una soluzione elegante, condivido la mia brutta ultima risorsa:

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

Tenete a mente che l'output del comando dovrebbe essere relativamente piccolo.

+0

Questo non funziona in plain Tcl 8.4. Anche se presumo che risolva il problema per il richiedente originale e un sacco di gente che viene qui, dal momento che diversi strumenti EDA implementano la redirezione della shell come output. Plain Tcl potrebbe soffocare su 'test> f1' con' # args sbagliati: dovrebbe essere "test" 'se' proc test {} {puts "Ciao, là!" } ' – cfi

4

Questo potrebbe funzionare:

redirect -variable ret {find_transistor m*} 

puts $ret 
+4

Bene, questo funziona solo con gli strumenti della società Synopsys. Probabilmente è ancora una buona risposta da mantenere, anche se non risponde alla domanda originale. Almeno probabilmente risolve il problema per un sacco di gente che viene qui. Comunque 'redirect' non è un semplice comando Tcl, e quindi non funziona in plain Tcl, e molto improbabile in qualsiasi altro strumento EDA basato su Tcl. – cfi

2

Se l'applicazione non dispone di un comando redirect, è possibile creare il proprio.

Si prega di dare un'occhiata a my answer per il più general question of how to redirect in plain Tcl?

Per reindirizzare in una variabile che si possa fare:

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

modo più semplice che ho trovato è exec: insieme VAR [comando exec]