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