【问题标题】:"expect" match "send" string, why?“expect”匹配“send”字符串,为什么?
【发布时间】:2013-02-04 15:48:05
【问题描述】:

我发现 send 命令之后的 expect 命令匹配来自 send 命令的数据。

让我们看看,my.sh:

#!/bin/sh
read line
echo ok

my.exp(有些代码是多余的,我模拟 DejaGNU 测试框架...):

set passn 0
proc pass {msg} { global passn; incr passn; send_user "PASS: $msg\n" }
set failn 0
proc fail {msg} { global failn; incr failn; send_user "FAIL: $msg\n" }
proc check {} {
    global passn failn;
    send_user "TOTOAL: [expr $passn + $failn], PASSED: $passn, FAIL: $failn\n"
    if {$failn == 0} { exit 0 } { exit 1 }
}

set timeout 1

spawn ./my.sh

send hello\n
expect {
    -ex hello {
        send_user "~$expect_out(0,string)~\n"
        pass hello
    }
    default { fail hello }
}
expect {
    -ex ok { pass ok }
    default { fail ok }
}

check

当运行 expect my.exp 我得到:

生成 ./my.sh 你好 ~你好~ 通过:你好 好的 通过:好的 总计:2,通过:2,失败:0

我不明白为什么 hello 匹配!请告诉我。我已经重读了:

【问题讨论】:

    标签: shell terminal tcl expect


    【解决方案1】:

    expect 与 pseudoterminal devices。他们是 很像普通终端:除非你禁用回声(使用期望的 stty 命令),您发送的任何内容也可以作为您的“终端 输出”(这是期望的输入)。

    stty_init 变量被期望用来设置新创建的 伪终端。如果您将set stty_init -echo 添加到 my.exp,测试将开始失败。

    【讨论】:

    • 感谢您的回答。我不希望关于 Expect 的问题可以用 SO 来回答!有人认为我不明白为什么我的代码会因 stty -echo 而失败,我会在调试问题时尝试这样做,但使用 stty_init -echo 可以工作......请稍等我要去读男人期待...
    • 还有 set stty_init {-echo raw} 我修复了 \r 的问题。我使用 Expect 来测试我的面向行的协议,这很烦人,而不是 \n 在匹配模式中使用 \r\n...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-09
    • 1970-01-01
    • 1970-01-01
    • 2019-12-03
    • 1970-01-01
    • 2018-05-05
    相关资源
    最近更新 更多