2010-10-06 2 views
8

Я хочу перенаправить вывод команды 1 в переменную, где OUTPUT обычно является STDOUT. Я запускаю инструмент EDA, который имеет tcl-интерпретатор & - это собственные команды. Допустим, что инструмент имеет TCL запрос, который говоритКоманда tcl перенаправляет на переменную, версия tcl равна 8.4

TOOL> find_transistor m* 
m1 m2 m3 m4 

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

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

Любые идеи?

+0

вы уверены, что find_transistor печатает на стандартный вывод, или вы предполагая, что на основе вашего интерактивного опыта? –

ответ

3

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

set ret [find_transistor m*] 

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

+5

Это не сработает, если «find_transistor» записывает свой результат в stdout. Весь ваш пример - это спасение, которое возвращает 'find_transistor', что, к сожалению, не является вопросом. –

+1

Вы, конечно, правы - если команда действительно пишет STDOUT, тогда потребуется другой подход. Нам действительно нужно, чтобы создатель вопроса возвращался и говорил с нами! – Jackson

+0

Я не являюсь автором вопроса, но столкнулся с той же проблемой. [] не будет работать для некоторых внутренних команд инструмента EDA, и эти команды печатают сообщения в STDOUT. Любое предложение? – solotim

0

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

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

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

+0

Это не работает в обычном Tcl 8.4. Хотя я действительно предполагаю, что он исправляет проблему для первоначального искателя и многих людей, приезжающих сюда, поскольку несколько инструментов EDA реализуют оболочку, такую ​​как перенаправление вывода. Plain Tcl задохнется на 'test> f1' с' неправильными # args: должен быть "test" 'if' proc test {} {puts "Привет, вот!" } ' – cfi

4

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

redirect -variable ret {find_transistor m*} 

puts $ret 
+4

Ну, это работает только для инструментов компании Synopsys. Наверное, это хороший ответ, если он не отвечает на исходный вопрос. По крайней мере, это, вероятно, решает проблему для многих людей, приезжающих сюда. Однако 'redirect' не является простой командой Tcl и, следовательно, не работает в обычном Tcl и очень маловероятен ни в каких других инструментах EDA, основанных на Tcl. – cfi

2

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

Пожалуйста, обратите внимание на my answer до более general question of how to redirect in plain 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

Простейший способ я нашел Exec: набор VAR [ВЫПЛН COMMAND]

Смежные вопросы