2013-02-03 33 views
2

我发现预计命令刚刚在发送命令匹配数据从发送命令。“期望”匹配“发送”字符串,为什么?

让我们看到,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我得到:

 
spawn ./my.sh 
hello 
~hello~ 
PASS: hello 
ok 
PASS: ok 
TOTOAL: 2, PASSED: 2, FAIL: 0 

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

回答

4

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

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

+0

感谢您的回答。我不希望有关** Expect **的问题可以在SO中得到解答!一个人认为我不明白为什么我的代码失败,用** stty -echo **,当我尝试调试问题时,但是用** stty_init -echo ** work ...只需一分钟我将阅读**男人期望** ... – gavenkoa

+0

还设置了stty_init {-echo raw} **我修复了** \ r **的问题。我使用** Expect **来测试我的面向行的协议,它很烦人而不是** \ n **在匹配模式中使用** \ r \ n ** ... – gavenkoa

相关问题