首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >未能从tclsh启动tclsh

未能从tclsh启动tclsh
EN

Stack Overflow用户
提问于 2017-05-18 21:42:39
回答 1查看 240关注 0票数 0

我从一个TCL脚本中启动多个tclsh来模拟多线程。然而,所有的电话都失败了。

我将问题简化为TCL启动tclsh的测试。

代码语言:javascript
复制
proc launch_tcl {} {
    set cmd "tclsh script.tcl"
    set pid [ eval $cmd & ]
}

这会产生:invalid command name "tclsh"

我可以在TCL提示符上给出以下行,它们可以正常工作。

代码语言:javascript
复制
    set cmd "tclsh script.tcl"
    set pid [ eval $cmd & ]

我已经尝试了tclsh与二进制的完整路径,以及在同样的失败。

为什么相同的命令在proc中失败?

谢谢,格特

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-18 21:54:30

虽然Tcl语法看起来与shell语法更相关,比如bash或tcsh,但实际上tcl与Perl、PHP或Ruby的关系更为密切。Tcl只解释tcl代码,因此只键入另一个可执行文件的名称就不会启动该可执行文件*。

就像Perl或Ruby (或者说是C和C++)一样,tcl确实有启动可执行文件的机制。为此,您需要exec命令:

代码语言:javascript
复制
exec tclsh script.tcl

关于执行委员会工作方式的警告:

与生成外部二进制文件的命令接受字符串的其他语言不同,tcl的exec与C或javascript的关系更密切,因为它接受结构化数据。如果你尝试这样做:

代码语言:javascript
复制
exec "tclsh script.tcl"

您将得到一个错误,抱怨"tclsh script.tcl“不存在。它将查找一个名为"tclsh script.tcl“的可执行文件(因为unix从一开始就允许程序名包含空格)。相反,您需要分别传递程序名和,每个单独的参数。同样,如果您尝试:

代码语言:javascript
复制
exec tclsh "arg1 arg2"

exec命令将执行tclsh并将字符串"arg1 arg2“作为第一个参数传递。

有关更多信息,请参见exec的文档:https://www.tcl.tk/man/tcl/TclCmd/exec.htm

如果字符串中有命令,怎么办?

不要将命令存储在字符串中。在tcl中,没有真正安全的方法来分离字符串中的参数。相反,将命令组合为一个列表,然后在调用exec时使用{*}操作符展开列表:

代码语言:javascript
复制
set cmd [list tclsh script.tcl]
exec {*}$cmd

*注:这可能会引起混淆,因为在交互模式下,如果键入tcl,tcl确实会启动可执行文件。但这只是互动模式的一个特点。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44058229

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档