spawn的可选参数

时间:2013-12-11 23:57:53

标签: tcl expect

我正在尝试使用可能(或不存在)的参数生成进程。我的实际代码如下所示:

set optionalParam ""

if { somecondition } {
    set optionalParam someValue
}

spawn foo.sh paramA paramB "param C" $optionalParam

somecondition为false时会出现问题。 foo.sh会看到一个附加参数,其值为空(如"")。

这样做的正确方法是什么?

2 个答案:

答案 0 :(得分:4)

有多种正确的方法可以做到这一点。就个人而言,我将所有参数放入一个列表中,然后在最后展开列表:

set params {paramA paramB "param C"}
if { somecondition } {
    lappend params someValue
}
spawn foo.sh {*}$params

如果您愿意,可以使用字符串执行相同的操作。

答案 1 :(得分:1)

如果你有Tcl 8.5或更高版本,你肯定应该使用扩展替换:

set optionalParam [list]
if { somecondition } {
    lappend optionalParam someValue
}

spawn foo.sh paramA paramB "param C" {*}$optionalParam

在8.4及之前,你被迫使用这样的东西:

set optionalParam [list]
if { somecondition } {
    lappend optionalParam someValue
}

eval [list spawn foo.sh paramA paramB "param C"] $optionalParam

这显然容易出错并且啰嗦,许多Tclers倾向于使用像

这样的快捷方式
set optionalParam ""
if { somecondition } {
    set optionalParam someValue
}
eval spawn foo.sh paramA paramB paramC $optionalParam

尽管如此,这对于"param C"来说会“有趣”失败。或者如果真实someValue中有空格。 (尝试为自己解决原因!如果你能在没有使用Tcl解释器的情况下完成它,请考虑自己有一个奖励点。)正是由于这些麻烦,我们在Tcl 8.5中添加了扩展语法,这是非常更容易做对。