我从一个TCL脚本中启动多个tclsh来模拟多线程。然而,所有的电话都失败了。
我将问题简化为TCL启动tclsh的测试。
proc launch_tcl {} {
set cmd "tclsh script.tcl"
set pid [ eval $cmd & ]
}这会产生:invalid command name "tclsh"
我可以在TCL提示符上给出以下行,它们可以正常工作。
set cmd "tclsh script.tcl"
set pid [ eval $cmd & ]我已经尝试了tclsh与二进制的完整路径,以及在同样的失败。
为什么相同的命令在proc中失败?
谢谢,格特
发布于 2017-05-18 21:54:30
虽然Tcl语法看起来与shell语法更相关,比如bash或tcsh,但实际上tcl与Perl、PHP或Ruby的关系更为密切。Tcl只解释tcl代码,因此只键入另一个可执行文件的名称就不会启动该可执行文件*。
就像Perl或Ruby (或者说是C和C++)一样,tcl确实有启动可执行文件的机制。为此,您需要exec命令:
exec tclsh script.tcl关于执行委员会工作方式的警告:
与生成外部二进制文件的命令接受字符串的其他语言不同,tcl的exec与C或javascript的关系更密切,因为它接受结构化数据。如果你尝试这样做:
exec "tclsh script.tcl"您将得到一个错误,抱怨"tclsh script.tcl“不存在。它将查找一个名为"tclsh script.tcl“的可执行文件(因为unix从一开始就允许程序名包含空格)。相反,您需要分别传递程序名和,每个单独的参数。同样,如果您尝试:
exec tclsh "arg1 arg2"exec命令将执行tclsh并将字符串"arg1 arg2“作为第一个参数传递。
有关更多信息,请参见exec的文档:https://www.tcl.tk/man/tcl/TclCmd/exec.htm
如果字符串中有命令,怎么办?
不要将命令存储在字符串中。在tcl中,没有真正安全的方法来分离字符串中的参数。相反,将命令组合为一个列表,然后在调用exec时使用{*}操作符展开列表:
set cmd [list tclsh script.tcl]
exec {*}$cmd*注:这可能会引起混淆,因为在交互模式下,如果键入tcl,tcl确实会启动可执行文件。但这只是互动模式的一个特点。
https://stackoverflow.com/questions/44058229
复制相似问题