我在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的新手。 “” [] {}和有什么其他封装参数的方式有什么区别?括号前后的空白规则是什么?
答案 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"
括号指定第一个单词是命令,应进行处理 作为命令。