Перенаправление команды tcl в переменную, версия tcl 8.4 - PullRequest
10 голосов
/ 06 октября 2010

Я хочу перенаправить вывод 1 команды в переменную, где ВЫХОД обычно равен STDOUT. Я использую инструмент EDA, в котором есть tcl interpeter и собственные команды. Допустим, у инструмента есть tcl-запрос, который говорит

TOOL> find_transistor m*
m1 m2 m3 m4

Я хочу иметь способ сделать следующее:

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

Есть идеи?

Ответы [ 6 ]

5 голосов
/ 21 февраля 2012

Это может работать:

redirect -variable ret {find_transistor m*}

puts $ret
5 голосов
/ 06 октября 2010

хорошо в чистом Tcl

set ret [find_transistor m*]

, вероятно, будет делать то, что вы хотите.Попробуйте прочитать учебник Tcl .

2 голосов
/ 31 августа 2016

Простейший способ, который я нашел, это exec: установить VAR [exec COMMAND]

2 голосов
/ 19 декабря 2012

Если ваше приложение не имеет команды redirect, вы можете создать свою собственную.

Пожалуйста, посмотрите мой ответ на более общий вопрос о том, какдля перенаправления в обычном 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 голосов
/ 19 апреля 2018

Я перепробовал все упомянутое здесь. Наконец это тот, который действительно работал для меня:

redirect -variable <myvar> {puts [<some_tcl_command>] }
puts $<myvar>

PS: Это работало в инструменте Cadence.

0 голосов
/ 29 августа 2011

Прежде чем кто-либо придумает элегантное решение, я поделюсь своим ужасным последним средством:

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

Имейте в виду, что вывод команды должен быть относительно небольшим.

...