TCL:将proc的输出重定向到文件

TCL:将proc的输出重定向到文件,tcl,Tcl,我需要将进程的输出重定向到文件。“重定向”命令不适用于我的工具使用的Tcl解释器。因此,我尝试使用“exec echo[proc_name]”,这是在这个站点的一个线程中建议的。但这不起作用,${dump_dir}/signal_list.txt文件显示为空 proc dump_signals {{dump_dir "."}} { upvar build build puts "Dumping signals.." set my_file [o

我需要将进程的输出重定向到文件。“重定向”命令不适用于我的工具使用的Tcl解释器。因此,我尝试使用“exec echo[proc_name]”,这是在这个站点的一个线程中建议的。但这不起作用,${dump_dir}/signal_list.txt文件显示为空

proc dump_signals {{dump_dir "."}} {
  upvar build build
  puts "Dumping signals.."
  set my_file [open ${dump_dir}/signal_list.txt w]
  exec echo [get_signals] > $my_file
}
“获取信号”是一个进程,它调用另一个进程

proc puts_name_and_value {name} {
  set value [value %h $name]
  puts "$name $value"
}

proc get_signals {} {

  # Get list of signals
  set signal_list {test.myreg test.myreg2}
  foreach signal $signal_list {
    puts_name_and_value $signal
  }
}
我现在的解决方法是,在底层过程中通过对file变量进行upvar来写入文件。这是可行的,但不是最干净的方法。请让我知道如何将proc的输出清晰地重定向到文件

proc puts_name_and_value {name} {
  upvar my_file my_file

  set value [value %h $name]
  puts $my_file "$name $value"
  #puts "$name $value"
}

proc get_signals {} {
  upvar my_file my_file

  # Get list of signals
  set signal_list {test.myreg test.myreg2}
  foreach signal $signal_list {
    puts_name_and_value $signal
  }
}

proc dump_signals {{dump_dir "."}} {
  upvar build build
  puts "Dumping signals.."
  set my_file [open ${dump_dir}/signal_list.txt w]
  get_signals
}

您的
dump_信号
proc写入标准输出,并且不返回任何内容。因此,当然,尝试使用shell将其输出重定向到文件不会在文件中产生任何结果

一种解决方案是将
tcl
的API与
chan push
chan pop
一起使用,以临时覆盖
stdout
的内容。例如:

#!/usr/bin/env tclsh

proc redirector {fd args} {
    switch -- [lindex $args 0] {
        initialize {
            # Sanity check
            if {[lindex $args 2] ne "write"} {
                error "Can only redirect an output channel"
            }
            return {initialize write finalize}
        }
        write {
            puts -nonewline $fd [lindex $args 2]
        }
        finalize {
            close $fd
        }
    }
}

proc writer_demo {} {
    puts "line one"
    puts "line two"
}

proc main {} {
    chan push stdout [list redirector [open output.txt w]]
    writer_demo
    chan pop stdout
}
main
运行此脚本将生成一个文件
output.txt
,其中包含
writer\u demo
put
调用的内容,而不是让它们像正常情况一样转到标准输出


您还可以将要写入的文件句柄作为参数传递给函数(而不是在任何地方使用
upvar
):

proc puts_name_and_value {out name} {
  set value [value %h $name]
  puts $out "$name $value"
}

proc get_signals {{out stdout}} {
  # Get list of signals
  set signal_list {test.myreg test.myreg2}
  foreach signal $signal_list {
    puts_name_and_value $out $signal
  }
}

proc dump_signals {{dump_dir "."}} {
  upvar build build
  puts "Dumping signals.."
  set my_file [open ${dump_dir}/signal_list.txt w]
  get_signals $my_file
}