我已经创建了一个安全的解释器(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
从主控制器中获取文件的。为什么会出现这种情况?
答案 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
子命令,请创建两个从属服务器并根据需要使用别名将它们连接在一起。