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

Tcl 从主解释器调用从属解释器中的隐藏命令,tcl,interpreter,Tcl,Interpreter,我已经创建了一个安全的解释器(interp create-safe),并希望通过interp invokehidden命令source从主程序中获取一个文件。但一开始我收到了以下错误消息 .. invalid command name "pwd" while executing "pwd" (file "C:/MyPkgFile.tcl" line 4) invoked from within 这是因为,文件在第4行包含以下代码 set usr_dir [file dirname

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

..
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
。然后错误传播到
文件
命令。再次将命令
文件
公开给从机。现在,我明白了

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
从主控获取文件。为什么会出现这种行为?

您需要公开正确的命令,并以一种使其工作的方式进行公开。这涉及到在cl的实现:由于Tcl 8.0中的bug,隐藏命令机制与名称空间不太兼容,而且从那时起修复它们就不是一个优先考虑的问题

您还必须处理这样一个事实:
rename
不会覆盖命令,并且在
中已经有一个伪命令::tcl::file::dirname
(这是一个给出“
不允许调用文件的子命令dirname
”错误消息的命令;实际上,这就是伪命令所做的一切)


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

FYI,
invokehidden
不是一个可传递的权限。它一次只能调用一个命令。非常感谢您的帮助。:)
# 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
}