10
votes

commande TCL redirige vers une variable, la version TCL est de 8,4

Je veux rediriger la sortie de 1 commande sur une variable, où la sortie est généralement sur stdout. Je gère un outil EDA, qui a TCL Interpeter et ses propres commandes. Disons que l'outil a une requête TCL, qui dit xxx

Je veux avoir un moyen de procéder à ce qui suit: xxx

idées?


1 commentaires

Êtes-vous certain que Find_Transistor est imprimée sur stdout ou en supposez-vous que sur la base de votre expérience interactive?


6 Réponses :


6
votes

Bien dans pure TCL

set ret [find_transistor m*]


3 commentaires

Cela ne fonctionnera pas si "Find_Transistor" écrit son résultat à Stdout. Tout votre exemple fait est sauvegarder tout recherche_transistor renvoie, ce qui n'est malheureusement pas ce que la question pose la question.


Vous êtes bien sûr correct - si la commande écrit vraiment sur STDOUT, une approche différente sera requise. Nous avons vraiment besoin de l'expéditeur de la question à revenir et à nous parler!


Je ne suis pas l'initiateur 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 à STDOUT. Toute suggestion?



0
votes

Avant que quiconque ne propose une solution élégante, je partage mon dernier recours: xxx

gardez à l'esprit que la sortie de la commande doit être relativement petite.


1 commentaires

Cela ne fonctionne pas dans le TCL ordinaire 8.4. Bien que je suppose que cela corrige le problème de l'adresseur d'origine et de nombreuses personnes qui arrivent ici, car plusieurs outils EDA implémentent Shell comme une redirection de sortie. Un plain TCL s'étoufferait sur test> F1 avec mauvais # args: devrait être "Tester" si proc tester {} {met "hi, là!" }



7
votes

Cela pourrait fonctionner:

redirect -variable ret {find_transistor m*}

puts $ret


1 commentaires

Eh bien, cela ne fonctionne que pour des outils de la société Synopsys. C'est probablement une bonne réponse à garder, même si cela ne répond pas à la question initiale. Au moins, cela résout probablement le problème pour beaucoup de gens qui arrivent ici. Toutefois, redirection n'est pas une commande de TCl ordinaire et ne fonctionne donc pas dans le TCL ordinaire et très improbable dans tout autre outil EDA basé sur TCL.



3
votes

Si votre application n'a pas de code> rediriger la commande code>, vous pouvez créer votre propre.

Veuillez consulter Ma réponse à plus Question générale de la redirection de TCL ordinaire ? p>

Pour rediriger dans une variable que vous pourriez faire: P>

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 commentaires

3
votes

La manière la plus simple que j'ai trouvée est EXEC: Set Var [Commande Exec]


1 commentaires

A fonctionné à merveille pour moi. Devrait être sur le dessus. @Liordagan, est-ce ce que vous cherchez? Je remarque que cette question n'a pas de réponse acceptée ...



1
votes

J'ai essayé tout mentionné ici. Enfin, c'est celui qui a effectivement fonctionné pour moi: xxx

ps: cela a fonctionné dans un outil de cadence.


0 commentaires