问题描述
当某些文本出现在屏幕上的任何地方时,我试图退出交互。
如果“按任意键”出现在屏幕上的任何位置 (-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"
。