如果一切都失败了,tcl脚本失败了

时间:2015-03-08 03:10:01

标签: tcl expect scp

我正在尝试制作一个脚本来将文件传输到另一台设备。由于我无法解释可能发生的每一个错误,我试图制作一个if-all-else失败的情况:

spawn scp filename login@ip:filename
expect "word:"
send "password"

expect {
    "100" {
        puts "success"
    } "\*" {
        puts "Failed"
    }
}

这总是返回一个失败的消息,甚至不传输文件,这段代码在哪里:

spawn scp filename login@ip:filename
expect "word:"
send "password"

expect "100"
puts "success"

显示文件的传输并打印成功消息。

我无法理解我的if-expect语句在第一段代码中出了什么问题。

1 个答案:

答案 0 :(得分:4)

问题在于\*。反斜杠将由Tcl翻译,从而使\*单独进入*,然后传递给expect

expect *

如您所知,*匹配任何内容。这就像说,"我不在乎输入缓冲区中的内容。扔掉它。" 这种模式总是匹配,即使没有任何东西。 请记住*匹配任何内容,空字符串就是任何东西!作为此行为的必然结果,此命令始终立即返回。它永远不会等待新数据到来。它没有必要因为它匹配所有东西。

我不知道你为什么使用*。假设,如果您打算匹配文字星号,请使用\\*

字符串\\*由Tcl翻译为\*。模式匹配器然后将\*解释为匹配文字*的请求。

expect "*" ;# matches * and? and X and abc
expect "\*" ;# matches * and? and X and abc
expect "\\*" ;# matches * but not? or X or abc

记住两条规则:

  1. Tcl翻译反斜杠序列。
  2. 模式匹配器将后面的字符视为文字。
  3. 注意:除了问题,一个观察。您将期望块视为if-else块。 与If-Else块不同。

    原因是,在传统的if-else块中,我们确定至少会执行一个块。但是,在expect中,情况并非如此。它更像是多个if块。