2010-10-06 38 views
8

Je souhaite rediriger la sortie de la commande 1 vers une variable, où OUTPUT est généralement STDOUT. Je cours un outil d'EDA, qui a tcl interpêtre & ses propres commandes. Disons que l'outil a une requête tcl, qui ditcommande tcl rediriger vers une variable, la version tcl est 8.4

TOOL> find_transistor m* 
m1 m2 m3 m4 

Je veux avoir une façon de faire ce qui suit:

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

Toutes les idées?

+0

êtes-vous certain que les impressions de find_transistor à stdout, ou êtes-vous En supposant que basé sur votre expérience interactive? –

Répondre

3

bien dans le plus pur Tcl

set ret [find_transistor m*] 

serait probablement faire ce que vous voulez. Essayez de lire le Tcl tutorial.

+5

Cela ne fonctionnera pas si "find_transistor" écrit son résultat dans stdout. Tout ce que vous avez à faire est de sauver ce que 'find_transistor' renvoie, ce qui malheureusement n'est pas ce que la question demande. –

+1

Vous avez bien sûr raison - si la commande écrit réellement sur STDOUT, une approche différente sera nécessaire. Nous avons vraiment besoin que l'auteur de la question revienne nous parler! – Jackson

+0

Je ne suis pas l'auteur de la question, mais j'ai rencontré le même problème. [] ne fonctionnera pas pour certaines commandes internes de l'outil EDA et ces commandes impriment des messages vers STDOUT. Toute suggestion? – solotim

0

Avant que quelqu'un arrive avec une solution élégante, je partage mon laid dernier recours:

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

Gardez à l'esprit que la sortie de la commande devrait être relativement faible.

+0

Ceci ne fonctionne pas en langage clair Tcl 8.4. Bien que je suppose qu'il corrige le problème pour le demandeur d'origine et beaucoup de gens qui viennent ici, car plusieurs outils EDA implémentent shell comme la redirection de sortie. Plain Tcl serait étouffer sur 'test> f1' avec' mauvais # args: devrait être "test" 'si' proc test {} {met "Salut, là!" } ' – cfi

4

Cela pourrait fonctionner:

redirect -variable ret {find_transistor m*} 

puts $ret 
+4

Eh bien, cela ne fonctionne que pour les outils de la société Synopsys. Probablement c'est toujours une bonne réponse à garder, même si elle ne répond pas à la question initiale. Au moins, cela résout probablement le problème pour beaucoup de gens qui viennent ici. Cependant, "redirect" n'est pas une simple commande Tcl, et ne fonctionne donc pas en Tcl simple, et très improbable dans tous les autres outils EDA basés sur Tcl. – cfi

2

Si votre application ne dispose pas d'une commande redirect, vous pouvez créer votre propre.

S'il vous plaît jeter un oeil à my answer au plus general question of how to redirect in plain Tcl?

Pour rediriger dans une variable que vous pourriez faire:

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

façon plus simple que j'ai trouvé est exec: set VAR [COMMANDE exec]