如何在特定输出的期望中结束交互?

问题描述

当某些文本出现在屏幕上的任何地方时,我试图退出交互。

如果“按任意键”出现在屏幕上的任何位置 (-o),下面代码的预期功能是存在交互。

但是它不起作用。知道这样做的正确方法是什么吗?

#!/usr/bin/expect -f


spawn program
# do stuff
interact  {

-o "*Press any key to continue*" {

send "^]"
send -- "7\r"
return
   }
}

# do more stuff

expect eof

解决方法

根据man expect,对于interact

默认情况下,字符串匹配是精确的,没有通配符。(相比之下,expect 命令默认使用 glob 样式模式。)

要匹配模式,您需要使用 -re (不支持-gl

[STEP 101] $ cat foo.exp
proc expect_prompt {} {
    upvar spawn_id spawn_id
    expect -re {bash-[.0-9]+[#$] $}
}

spawn bash --noprofile --norc
expect -re {bash-[.0-9]+[#$] $}

set flag 0
interact {
    -o
    -re "LET.*OUT" {
        send_user $interact_out(0,string)
        set flag 1
        return
    }
}
expect_prompt

if { $flag } {
    send "echo Do something\r"
    expect_prompt
}

send "exit\r"
expect eof
[STEP 102] $

结果:

[STEP 103] $ expect foo.exp
spawn bash --noprofile --norc
bash-5.1$ echo let me out | tr a-z A-Z    # <-- manual input
LET ME OUT
bash-5.1$ echo Do something
Do something
bash-5.1$ exit
exit
[STEP 104] $

顺便说一下,要发送 ESC(或 Ctrl [),请使用 send "\x1b"