Ожидаемая программа зависает, потому что вы сопоставляете первую «собаку», посылаете лай, затем вы expect eof
с бесконечным таймаутом.Конечно, у вас нет «eof», потому что сценарий оболочки ожидает ввода.
Вам нужно использовать команду exp_continue
для своих циклов, а не while
:
#!/usr/bin/expect -f
set timeout -1
spawn ./questions.sh
expect {
-re {dog \?\r\n$} { send -- "bark\r"; exp_continue }
-re {(?!dog)\S+ \?\r\n$} { send -- "mew\r"; exp_continue }
eof
}
Я сделал шаблоны гораздо более конкретными: либо «собака», либо «не собака», за которыми следуют пробел, вопросительный знак и символы конца строки.
Команды exp_continue
сохранят зацикливание кодав пределах команды ожидаемого до тех пор, пока не встретится «eof».
Мы можем сделать шаблон немного СУХИМ:
expect {
-re {(\S+) \?\r\n$} {
if {$expect_out(1,string) eq "dog"} then {send "bark\r"} else {send "mew\r"}
exp_continue
}
eof
}