可用频道的 Tcl 列表
Tcl list of available channles
有没有办法获得可用的 tcl 频道列表?我正在使用内置 tcl 解释器的第三方工具,所以在我执行 close stdout
之后,它仍将输出打印到提示符。
怀疑它正在使用另一个通道,因为在关闭 stdout 后,我尝试了 puts "hello"
,它给出了一个错误 no channel named stdout found
TIA
chan names ?pattern?
将 return 开放频道列表,可选择匹配模式。
请注意,同一个频道可能会被口译员共享。考虑以下代码:
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 }
有没有办法获得可用的 tcl 频道列表?我正在使用内置 tcl 解释器的第三方工具,所以在我执行 close stdout
之后,它仍将输出打印到提示符。
怀疑它正在使用另一个通道,因为在关闭 stdout 后,我尝试了 puts "hello"
,它给出了一个错误 no channel named stdout found
TIA
chan names ?pattern?
将 return 开放频道列表,可选择匹配模式。
请注意,同一个频道可能会被口译员共享。考虑以下代码:
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 }