从主解释器调用从解释器中的隐藏命令

时间:2015-03-23 09:01:16

标签: tcl interpreter

我已经创建了一个安全的解释器(interp create -safe),并希望通过source命令从主服务器interp invokehidden中创建一个文件。但是我首先收到以下错误消息

..
invalid command name "pwd"
    while executing
"pwd"
  (file "C:/MyPkgFile.tcl" line 4)
invoked from within

这是因为,该文件在第4行包含以下代码

set usr_dir [file dirname [file join [pwd] [info script]]]

然后使用interp expose,我可以访问命令pwd。然后将错误传播到file命令。再次,将命令file暴露给奴隶。现在,我得到了

not allowed to invoke subcommand dirname of file
    while executing
"file dirname [file join [pwd] [info script]]"

我如何才能访问子命令?我试过以下,

interp expose myslave file
interp expose myslave file dirname
interp expose myslave {file dirname}

没有运气。 :(。我怎么能做到这一点?

我并没有期望自己将这些命令暴露给奴隶,因为我是通过invokehidden从主控制器中获取文件的。为什么会出现这种情况?

1 个答案:

答案 0 :(得分:1)

您需要公开正确的命令,并以使其工作的方式执行此操作。这涉及到在Tcl的实现中更接近于一个更糟糕的错误:隐藏的命令机制由于Tcl 8.0中的错误而无法与命名空间相关并且它不是一个从那以后,高度优先解决它们。

你还必须处理rename不会覆盖命令的事实,以及::tcl::file::dirname已经存在虚拟命令的事实(这是{&1;}给出“not allowed to invoke subcommand dirname of file”错误消息;实际上,这就是虚拟命令的所有内容。

# Grant the command back into the slave with a temporary name
interp expose myslave tcl:file:dirname DIRNAME
interp eval myslave {
    # Get rid of that dummy command
    rename ::tcl::file::dirname ""
    # Put the exposed command into place
    rename DIRNAME ::tcl::file::dirname
}

在强制强烈之前,建议您在解释器中执行任何不安全的代码之前执行此操作。如果您需要运行两个不安全的代码,只有一个访问dirname子命令,请创建两个从属服务器并根据需要使用别名将它们连接在一起。