Expect脚本处理Bash交互时遇cat提示无响应的排查求助
解决Expect脚本卡在cat提示的问题
我猜你这问题大概率是踩了Expect匹配逻辑的坑——我之前做自动化交互脚本时也栽过类似的跟头!先帮你捋清楚根因,再给你直接能用的修复方案。
问题出在哪?
Expect是顺序匹配的:如果你的脚本先写了匹配*dog ?的规则,还加了exp_continue让它循环等下一个dog提示,那当1 cat ?这种非dog的提示出现时,第一个expect会一直卡在那等dog,完全不会去触发后面的cat匹配规则。这就是为啥你处理完所有dog提示后,脚本直接挂在cat那里不动了。
另外还有个小细节:Bash的read -p输出的提示是不带换行的,要是Expect的匹配逻辑没考虑缓冲区的情况,也可能出现捕获不到完整提示的问题,但这个是次要因素。
修复后的Responder.sh脚本
把所有匹配规则放到同一个expect块里,让Expect同时监听所有可能的提示,就不会卡在单一规则上了:
#!/usr/bin/expect set timeout -1 ;# 禁用超时,确保能处理完所有提示 spawn ./questions.sh # 同时监听dog和cat的提示,匹配到对应规则就回复 expect { "*dog ?" { send "bark\r" exp_continue ;# 处理完当前提示后,继续等待下一个 } "*cat ?" { send "mew\r" exp_continue ;# 同上 } eof { exit } ;# 子进程结束时自动退出Expect }
额外优化:更灵活的正则匹配
如果你的questions.sh里的数字是动态变化的(比如从1到N),可以用正则匹配来适配任意数字的情况,避免字符串匹配的小偏差:
expect { -re {[0-9]+ dog \?} { send "bark\r" exp_continue } -re {[0-9]+ cat \?} { send "mew\r" exp_continue } eof { exit } }
顺便确认你的questions.sh写法
确保你的Bash脚本是正常输出提示的,比如标准的嵌套循环写法应该是这样:
#!/bin/bash for num in {1..3}; do for animal in dog cat; do read -p "$num $animal ? " response echo "Received: $response" done done
如果你的questions.sh是类似这样的,用上面修复后的Expect脚本肯定能跑通所有提示,不会再卡在cat环节啦。
内容的提问来源于stack exchange,提问作者keypoint
相关产品推荐
相关产品推荐

