【问题标题】:tcl command redirect to a variable, tcl version is 8.4tcl 命令重定向到一个变量,tcl 版本是 8.4
【发布时间】:2011-04-22 00:33:15
【问题描述】:

我想将 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

有什么想法吗?

【问题讨论】:

  • 您确定 find_transistor 打印到标准输出,还是根据您的交互体验假设?

标签: tcl output-redirect


【解决方案1】:

这可能有效:

redirect -variable ret {find_transistor m*}

puts $ret

【讨论】:

  • 嗯,这仅适用于 Synopsys 公司的工具。可能它仍然是一个很好的答案,即使它没有回答原始问题。至少它可能解决了很多来到这里的人的问题。然而redirect 不是一个普通的 Tcl 命令,因此不能在普通的 Tcl 中工作,在任何其他基于 Tcl 的 EDA 工具中也不太可能。
【解决方案2】:

在纯 Tcl 中很好

set ret [find_transistor m*]

可能会做你想做的事。尝试阅读 Tcl tutorial

【讨论】:

  • 如果“find_transistor”将其结果写入标准输出,这将不起作用。您的示例所做的只是保存find_transistor 返回的任何内容,不幸的是,这不是问题所在。
  • 您当然是正确的 - 如果命令确实正在写入 STDOUT,则需要使用不同的方法。我们真的需要问题的发起人回来和我们谈谈!
  • 我不是问题的发起者,但我遇到了同样的问题。 [] 不适用于某些 EDA 工具内部命令,并且这些命令会将消息打印到 STDOUT。有什么建议吗?
【解决方案3】:

如果您的应用程序没有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
}

【讨论】:

    【解决方案4】:

    我发现的最简单的方法是 exec: set VAR [exec COMMAND]

    【讨论】:

    • 对我来说就像一个魅力。应该在上面。 @LiorDagan,这就是你要找的东西吗?我注意到这个问题没有公认的答案......
    【解决方案5】:

    我尝试了这里提到的一切。最后,这是真正为我工作的一个:

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

    PS:这在 Cadence 工具中有效。

    【讨论】:

      【解决方案6】:

      在任何人想出一个优雅的解决方案之前,我分享一下我丑陋的最后一招:

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

      请记住,命令的输出应该相对较小。

      【讨论】:

      • 这在纯 Tcl 8.4 中不起作用。虽然我确实认为它解决了最初的提问者和许多来到这里的人的问题,因为几个 EDA 工具实现了类似于输出重定向的 shell。如果proc test {} { puts "Hi, there!" }wrong # args: should be "test",普通的Tcl 会阻塞test &gt;f1wrong # args: should be "test"
      猜你喜欢
      • 1970-01-01
      • 2020-12-29
      • 1970-01-01
      • 2015-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多