在服务器端执行命令

Executing command on the server side

在尝试使用 TCL 运行 基于服务器-客户端的功能时,我无法执行命令 tcl 命令,而不是 puts "string" 当客户端发送一些东西在服务器端执行(客户端和服务器都是基于 tcl 的)。我在客户端尝试了如下命令:

puts $channel {set x 1};flush $channel;
puts $channel {incr x}; flush $channel;
puts $channel {puts $x}; flush $channel;

但是最后一行没有显示x的值,它只是给出一个空行作为输出。在服务器端,我使用:

if {[catch {eval $line} $result]} {puts $result }

有人可以提出为什么 x 没有被评估和打印吗?此外,如何为从客户端发送到服务器或反之亦然的变量定义范围?

catch 命令的第三个参数应该是一个变量 name。您使用了结果变量的 value,它显然是空的,因为您报告该命令产生一个空行作为输出。

所以你至少要省略美元符号:

if {[catch {eval $line} result]} {puts $result}

但是考虑到 catch 将评估它的第二个参数,这有点令人费解。可以简化为:

if {[catch $line result]} {puts $result}

当您在 proc 中处理套接字数据时(您从例如文件事件调用),范围将是该 proc。所以每次你都会得到一个(几乎)空白的范围。 运行 在 proc 的不同调用中的早期命令的效果将丢失。这就是 puts $x 可能因 can't read "x": no such variable.

而失败的原因

您可以 运行 在全局范围内使用以下命令接收命令:

if {[catch {uplevel #0 $line} result]} {puts $result}

在单独的(安全的)解释器中 运行 它们可能更好:

# In your initialization code (running once):
interp create rje

# In your file event handler:
if {[catch {rje eval $line} result]} {puts $result}

使用安全解释器时,它不会自动访问“stdout”通道。您必须按如下方式进行运行ge:

# In your initialization code (running once):
interp create -safe rje
interp share {} stdout rje

# In your file event handler:
if {[catch {rje eval $line} result]} {puts $result}