2013-02-03 28 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

相關問題