1

所以我对TCL编程的方式非常陌生。我写了一个脚本,调用别人写的proc,首先删除输出文件。然后它会执行我编写的一些附加逻辑。

我将逻辑移到了第二个 proc 中,然后其中的一部分立即损坏了(即 rm 命令)。

据我所知,中央执行内部的第一个程序(proc定义后面的文本)在没有“exec”命令的情况下正常执行。但是,如果将它移动到 proc 中,它现在需要一个“exec”命令。

谁能向我解释为什么 TCL 会这样?

例如

proc helloworld {} {
  puts "hi"
}
#works
rm my_file 
helloworld

..

proc helloworld {} {
  #doesn't work
  rm my_file 
  puts "hi"
}
helloworld

..

proc helloworld {} {
  #works
  eval rm my_file 
  puts "hi"
}
helloworld

..

proc helloworld {} {
  #works
  file delete my_file 
  puts "hi"
}
helloworld

*请注意,这种奇怪的行为可能特定于我将脚本提供给 vmd 的程序,它有自己的内置 TCL 行为。也许在您的回复中您可以指出这是否也是其他口译员的标准?

4

2 回答 2

5

交互式tclsh 会话将尝试未知exec命令(例如rm)。在非交互式脚本执行中,或者如您所发现的,在 procs 中,您不能指望这种行为。

我看不到这在tclsh手册页中有记录,但未知的手册页有。另请参阅 Tcl wiki 上的tclsh页面。在交互式 tclsh 会话中,您可以unknown通过键入以下内容来查看:

info body unknown

[更新]

引用“Tcl 和 Tk 中的实用编程”:

unknown命令提供了一些其他便利。这些仅在您直接键入命令时使用。一旦执行进入一个过程或者如果 Tcl shell 没有被交互使用,它们就会被禁用。便利功能是程序的自动执行、命令历史记录和命令缩写。如果无法从脚本库加载命令实现,则按顺序尝试这些选项。

于 2010-10-14T12:51:33.873 回答
2

请注意,这也可以通过变量tcl_interactive以编程方式测试,如果 Tcl 正在通过交互式 shell 运行,则为“1”,否则为“0”。该变量也是可设置的,因此可以启动一个交互式 shell,然后[set tcl_interactive 0]并继续。在这一点上,一个人失去了这样的特征

  • %命令提示符
  • proc 名称/命令名称完成(即:无法键入[pu "xyz"]并获得键入[puts "xyz"]的效果,就像交互式 shell)
  • 自动“脱壳”让外部命令完成一个请求(就像这个原始问题中的“rm”)
  • 或许还有其他人……

  • 于 2010-12-19T04:24:35.000 回答