Перенаправление команды tcl на переменную, версия tcl 8.4

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

TOOL> find_transistor m*
m1 m2 m3 m4

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

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

Есть идеи?


person Lior Dagan    schedule 06.10.2010    source источник
comment
вы уверены, что find_transistor печатает на стандартный вывод, или вы предполагаете это на основе своего интерактивного опыта?   -  person Bryan Oakley    schedule 11.10.2010


Ответы (6)


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

redirect -variable ret {find_transistor m*}

puts $ret
person Ray    schedule 21.02.2012
comment
Что ж, это работает только для инструментов компании Synopsys. Вероятно, это все еще хороший ответ, даже если он не отвечает на исходный вопрос. По крайней мере, это, вероятно, решает проблему для многих людей, приходящих сюда. Однако redirect не является простой командой Tcl и, следовательно, не работает в простом Tcl, и очень маловероятно, что в каких-либо других инструментах EDA на основе Tcl. - person cfi; 18.12.2012

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

set ret [find_transistor m*]

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

person Jackson    schedule 06.10.2010
comment
Это не сработает, если find_transistor запишет результат в стандартный вывод. Все, что делает ваш пример, это сохраняет все, что возвращает find_transistor, что, к сожалению, не то, что задает вопрос. - person Bryan Oakley; 11.10.2010
comment
Вы, конечно, правы - если команда действительно пишет в STDOUT, то потребуется другой подход. Нам очень нужно, чтобы автор вопроса вернулся и поговорил с нами! - person Jackson; 12.10.2010
comment
Я не автор вопроса, но столкнулся с той же проблемой. [] не будет работать для некоторых внутренних команд инструмента EDA, и эти команды выводят сообщения в STDOUT. Любое предложение? - person solotim; 29.08.2011

Если в вашем приложении нет команды 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
}
person cfi    schedule 19.12.2012

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

person Dylan J Bennett    schedule 30.08.2016
comment
Работал как шарм для меня. Должен быть сверху. @LiorDagan, это то, что ты ищешь? Я заметил, что на этот вопрос нет принятого ответа... - person Khuldraeseth na'Barya; 28.06.2019

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

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

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

person Balamurugan    schedule 19.04.2018

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

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

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

person solotim    schedule 29.08.2011
comment
Это не работает в обычном Tcl 8.4. Хотя я предполагаю, что это устраняет проблему для исходного спрашивающего и многих людей, приходящих сюда, поскольку некоторые инструменты EDA реализуют перенаправление вывода, подобное оболочке. Обычный Tcl подавился бы test >f1 с wrong # args: should be "test", если бы proc test {} { puts "Hi, there!" } - person cfi; 18.12.2012