You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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机制疑问解答

  1. 为什么interact后sleep 1再send "\r"无法发送回车键?
    interact是Expect把终端控制权完全交给用户的指令,脚本会直接暂停在interact语句处,直到用户手动按^](默认退出键)结束交互,所以后面的sleep和send代码根本不会执行。如果要在交互中注入指令,得用interact {send "\r"}这种绑定语法,但这依然是在用户交互过程中插入操作,不适合纯自动化场景。

  2. 为什么timeout设为1时发送Up键失败,设为2则可持续发送,且回车键所需超时更短?['\x1b' ']异常序列来源是什么?

  • 超时时间的差异是因为gh cli的界面响应逻辑不同:回车键是确认当前选项的即时操作,界面不需要额外渲染;而Up键需要等待主菜单界面完全加载、光标处于可移动状态才能生效,所以需要更长的超时确保界面就绪。
  • ['\x1b' ']是终端的ANSI转义序列,gh cli用这些序列来渲染彩色界面、移动光标、刷新菜单,Expect捕获到这些非文本控制字符后,就会以这种格式显示,属于正常现象。
  1. 为什么混合Enter和Up键的interact代码仅执行最后一条指令且无限循环?
    如果你的代码是把send放在interact外面,或者错误地给interact重复绑定了键位动作,会导致脚本卡在interact的交互循环里,之前的指令没被正确触发,只有最后一条绑定的指令生效。纯自动化场景下完全不需要用interact,spawn+expect+send的组合才是正确的自动化交互方式。

内容的提问来源于stack exchange,提问作者Han Qi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 18:22:37