Tcl可用频道列表



是否有办法获得可用的tcl通道列表?我使用的是第三方工具,它内置了tcl解释器,所以在我执行close stdout之后,它仍然将输出打印到提示符。

怀疑它正在使用另一个通道,因为在关闭stdout后,我尝试了puts "hello",它给出了一个错误没有命名为stdout的通道找到

TIA

注意,一个通道可能被解释器共享。考虑下面的代码:

interp create foo
interp share {} stdout foo
close stdout
chan names; # stdin stderr
puts hello; # can not find channel named "stdout"
foo eval {puts hello}; # hello

因此,即使stdout在一个解释器中已关闭,它仍然可能对其他解释器可用。

事实上,甚至没有必要显式地与从解释器共享标准输出,除非它被创建为一个安全解释器。标准I/O通道自动与常规解释器共享。

如果没有关于第三方工具内部工作原理的更多信息,就很难确定发生了什么。

Tcl解释器有可能重写puts命令,以便即使您执行close stdout,它也可以写入像stdout一样工作的东西。这甚至相当容易做到(如果您在子解释器中运行并且puts别名于父解释器中的某些内容)。它很繁琐的唯一原因是puts的参数模式不适合过程将参数映射到形式参数的方式。这是一个错误的版本-它缺少很多解析代码-但接近。

proc magicPuts {interp args} {
if {[llength $args] == 1} {
puts [lindex $args 0]
} else {
$interp invokehidden puts {*}$args
}
}
set subinterp [interp create]
interp hide $subinterp puts
interp alias $subinterp puts {} magicPuts $subinterp
interp share {} stdout $subinterp
$subinterp eval { source yourscript.tcl }

chan names ?pattern?将返回一个开放通道列表,可选地匹配该模式。

http://www.tcl-lang.org/man/tcl8.6/TclCmd/chan.htm M27