如何用Expect工具自动化GitHub Copilot CLI交互操作
用Expect自动化gh cli交互的解决方案及常见疑问解答
需要自动化完成以下gh cli操作序列:
- 按Enter选择
generic shell command - 按Enter选择
Copy command to clipboard - 按Up键将光标移至
Exit选项 - 按Enter退出gh cli
当前无法正确组合Expect的timeout、interact、send等指令,怀疑gh copilot的剪贴板操作干扰交互,或之前脚本运行有副作用,同时有三个Expect机制疑问需要解答。
正确的Expect脚本实现
不要用interact(它是用来交给用户手动交互的,完全不适合纯自动化场景),而是通过expect匹配gh cli输出的界面特征,确认界面就绪后再发送对应指令。以下是可行的脚本:
#!/usr/bin/expect -f # 启动目标gh copilot命令(替换成你实际调用的命令,比如gh copilot suggest) spawn gh copilot suggest # 等待界面加载,匹配到generic shell command选项(根据实际界面文本调整匹配内容) expect -timeout 3 "generic shell command" send "\r" # 等待复制选项界面出现 expect -timeout 2 "Copy command to clipboard" send "\r" # 等待回到主菜单,匹配Exit选项的提示 expect -timeout 2 "Exit" send "\x1b[A" ;# 发送Up键的标准ANSI转义序列 send "\r" # 等待进程正常退出 expect eof
脚本说明:
- 用
spawn启动目标命令,全程由脚本控制交互,而非交给用户手动操作 - 每个
expect都设置了合理的超时时间,确保界面完全加载就绪后再发送指令,避免操作提前执行导致失败 - Up键用终端通用的ANSI转义序列
\x1b[A发送,兼容性更好
你的三个Expect机制疑问解答
为什么
interact后sleep 1再send "\r"无法发送回车键?interact是Expect把终端控制权完全交给用户的指令,脚本会直接暂停在interact语句处,直到用户手动按^](默认退出键)结束交互,所以后面的sleep和send代码根本不会执行。如果要在交互中注入指令,得用interact {send "\r"}这种绑定语法,但这依然是在用户交互过程中插入操作,不适合纯自动化场景。为什么timeout设为1时发送Up键失败,设为2则可持续发送,且回车键所需超时更短?
['\x1b' ']异常序列来源是什么?
- 超时时间的差异是因为gh cli的界面响应逻辑不同:回车键是确认当前选项的即时操作,界面不需要额外渲染;而Up键需要等待主菜单界面完全加载、光标处于可移动状态才能生效,所以需要更长的超时确保界面就绪。
['\x1b' ']是终端的ANSI转义序列,gh cli用这些序列来渲染彩色界面、移动光标、刷新菜单,Expect捕获到这些非文本控制字符后,就会以这种格式显示,属于正常现象。
- 为什么混合Enter和Up键的interact代码仅执行最后一条指令且无限循环?
如果你的代码是把send放在interact外面,或者错误地给interact重复绑定了键位动作,会导致脚本卡在interact的交互循环里,之前的指令没被正确触发,只有最后一条绑定的指令生效。纯自动化场景下完全不需要用interact,spawn+expect+send的组合才是正确的自动化交互方式。
内容的提问来源于stack exchange,提问作者Han Qi
相关产品推荐
相关产品推荐

