Вопрос: Команда tcl перенаправляет на переменную, версия tcl - 8.4


Я хочу перенаправить вывод команды 1 в переменную, где OUTPUT обычно является 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

Есть идеи?


8


источник


Ответы:


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

redirect -variable ret {find_transistor m*}

puts $ret

4



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

set ret [find_transistor m*]

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


3



Если ваше приложение не имеет 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
}

2



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

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

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


0



Самый простой способ, которым я нашел, - exec: set VAR [exec COMMAND]


0



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

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

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


0