可用频道的 Tcl 列表

Tcl list of available channles

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

怀疑它正在使用另一个通道,因为在关闭 stdout 后,我​​尝试了 puts "hello",它给出了一个错误 no channel named stdout found

TIA

chan names ?pattern? 将 return 开放频道列表,可选择匹配模式。

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

请注意,同一个频道可能会被口译员共享。考虑以下代码:

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,其他解释器仍然可以使用它。

事实上,甚至没有必要显式地与从解释器共享 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 }