在 tclsh 中,我想隐藏一个不能直接调用但可以以某种方式调用的命令。有没有一个好的方法可以做到这一点或者我可以研究的想法。
您可以使用该命令隐藏命令,前提是它们位于全局命名空间中(我知道这很丑陋!)interp hide。然后您可以interp invokehidden调用它们并interp expose撤消隐藏:
% proc hideme args {puts "HIDDEN: args=$args"}
% hideme foo
HIDDEN: args=foo
% interp hide {} hideme
% hideme foo
invalid command name "hideme"
% interp invokehidden {} hideme foo
HIDDEN: args=foo
% interp hidden {}
hideme
% interp expose {} hideme
% interp invokehidden {} hideme foo
invalid hidden command name "hideme"
% hideme foo
HIDDEN: args=foo
Run Code Online (Sandbox Code Playgroud)
这是 Tcl 中安全机制的一部分,但仅当该命令被父解释器隐藏时才有效。在上面的情况下,从技术上讲,这并不是因为您隐藏了自己并且可以再次找到隐藏的命令。没有安全边界就没有安全。({}是空字符串,是当前解释器相对于其自身的“名称”。)
安全解释器隐藏了许多标准命令,导致解释器默认无法与操作系统交互。