在tcl exec中传递变量参数的正确方法是哪种?

时间:2018-08-21 14:05:42

标签: linux tcl parameter-passing

我在Linux上工作,并且通常在shell中执行以下命令:

SomeCommand <Standard params> <params of type A> <params of type B> > Out.log

现在我想像这样在TCL脚本中调用它:

set ParamsA "-some params of type A"
set ParamsB "-some params of type B"
set AllParams "-moreStandardParams $ParamsA $ParamsB"
exec SomeCommand $AllParams > Out.log

我在使这项工作上有些困难,因为无论我尝试什么,我似乎都无法使所有参数对SomeCommand可见。 正确的做法是什么? 我显然是TCL的新手。 “” [] {}和有什么其他封装参数的方式有什么区别?括号前后的空白规则是什么?

1 个答案:

答案 0 :(得分:0)

基本问题是run_mel以一组单词作为参数,它是 只能通过一个。

我喜欢使用列表来构建命令行。然后对于实际的exec,必须将列表扩展成单独的单词。列表有一个 优点是,当它们转换为字符串(例如exec)时, 规范化(字符串化,序列化)形式将始终转换回 相同的列表。

$mylist

如果您使用的是Tcl的旧版本,则需要使用eval语句:

set cmd mycommand
lappend cmd -param1 p1
lappend cmd -param2 p2
if { $someoption } {
  lappend cmd -param3 p3
}
lappend cmd -debug

exec {*}$cmd > $outfile

编辑:错过了问题的另一半。

双引号将字符串括起来并允许对转义字符进行插值 和变量和命令的替换:

eval exec $cmd > $outfile

括号类似于源自于algol的语言中的单引号。他们指定一个字符串。没有命令和变量替换完成。反斜杠插值未完成:

 set cmd command
 "here is [string toupper my] $cmd\r\n"

括号指定第一个单词是命令,应进行处理 作为命令。