如何编写Bash交互脚本测试rh-create交互式命令
带方向键选择的CLI脚手架自动化交互实现
针对类vue-cli的交互式脚手架rh-create的流水线自动化测试需求,yes、printf这类管道输入方式无法传递方向键对应的ANSI控制序列,也无法被CLI识别为真实终端环境,可通过以下方案实现全流程自动交互:
首选方案:使用expect实现全键盘模拟
expect是专门为自动化终端交互设计的工具,可模拟所有键盘输入(含方向键、回车、特殊字符),自动挂载伪终端运行目标命令,适配绝大多数交互式CLI场景。
操作步骤
- 安装依赖:
- Debian/Ubuntu 环境:
apt update && apt install -y expect - CentOS/RHEL 环境:
yum install -y expect - macOS 环境:
brew install expect
- Debian/Ubuntu 环境:
- 编写交互脚本,根据
rh-create的实际交互流程调整匹配规则和输入序列即可,示例如下:
#!/usr/bin/expect # 设置全局超时时间(单位:秒),拉取模板、安装依赖耗时较长建议设为300以上 set timeout 300 # 启动目标脚手架命令 spawn rh-create # 匹配项目名输入提示,输入测试项目名后回车(\r代表回车) expect "项目名称" send "rh-test-demo\r" # 匹配框架/模板选择提示,按2次下方向键选中第3个选项后回车 # 方向键对应ANSI转义序列:上=\033[A 下=\033[B 右=\033[C 左=\033[D expect "选择模板" send "\033\[B\033\[B" send "\r" # 匹配依赖安装提示,输入y确认 expect "安装依赖" send "y\r" # 等待命令执行完成,保留输出到流水线日志 expect eof
- 给脚本加执行权限后直接在流水线步骤中调用即可:
chmod +x auto_rh_create.exp ./auto_rh_create.exp
适配技术栈的替代方案
如果流水线本身基于特定语言开发,无需额外安装expect,可直接用对应语言的伪终端库实现:
- Node.js技术栈:使用
node-pty库创建伪终端进程,监听输出匹配提示后,写入对应输入内容(方向键同样传入上述ANSI转义序列即可) - Python技术栈:使用标准库
pty或第三方封装库pexpect,交互逻辑和expect完全一致
避坑提示
- 禁止用普通管道、重定向方式给脚手架传输入:绝大多数带选择菜单的CLI会检测运行环境是否为真实TTY,非TTY环境会直接退出或跳过交互流程
- 提示匹配规则只需要匹配关键字即可,不要匹配完整提示文本,避免因提示带颜色转义字符、前后空格导致匹配失败
- 涉及网络拉取、依赖安装的步骤一定要留足超时时间,避免流程中途被打断
参考交互界面示例:
内容的提问来源于stack exchange,提问作者huan feng
相关产品推荐
相关产品推荐


