【问题标题】:Tcl pass args "as is" to procTcl 将参数“按原样”传递给 proc
【发布时间】:2014-11-13 13:08:59
【问题描述】:

我要发送命令

exp_send -i $sid -- "yes\r"

到一个将执行命令并检查错误的函数。 应该是:

catch {exp_send -i $sid -- "yes\r"}

在哪里:

[catch {$cmd [join $args]}

这段代码有什么问题:

package require Expect

proc ErrorDetector {cmd args} {

    global res

    if { [catch {$cmd [join $args]} results] } {
       puts "Connection Could not open for exp_send\n $results"
       return -level 0 0
     }

    puts sion.
}


global spawn_id
set sid [spawn cmd.exe]
exp_send {ssh root@10.64.88.240}


ErrorDetector exp_send -i $sid -- "yes\r"

命令:

$cmd [join $args]

没有运行为:

$cmd [join $args]

【问题讨论】:

    标签: list tcl proc args


    【解决方案1】:

    如果你在 Expect 后面有足够新的 Tcl 版本,你可以这样做:

    $cmd {*}$args
    

    否则,对于旧版本的 Tcl(8.4 及之前),正确的方法是以下之一:

    eval [list $cmd] $args
    # Paranoid version: eval [list $cmd] [lrange $args 0 end]
    
    eval [linsert $args 0 $cmd]
    

    以上所有内容都将精确地保留您作为参数提供给您的过程的单词。 join 的东西不会;该命令特别适用于创建人类可读列表之类的东西,以及处理旧式“数据库”记录,例如在 Unix 密码数据库中找到的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-12
      • 1970-01-01
      • 2013-04-24
      • 1970-01-01
      • 1970-01-01
      • 2011-11-14
      • 2018-07-06
      • 1970-01-01
      相关资源
      最近更新 更多