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

如何自动化传递运行时选项至需交互式输入的程序?

解决交互式程序的自动化输入问题(应对错误重试场景)

我之前也碰到过一模一样的困扰——普通的echo或printf管道输入,在遇到会重复提示错误的交互式程序时,很容易因为输入时机不匹配直接卡住。这类场景下,最可靠的方案是用**expect工具**,它能监听程序的输出提示,精准发送对应的输入,哪怕程序反复重试也能正确响应。

核心思路

expect是专门用于处理交互式命令行程序的工具,它的工作逻辑是:

  1. 启动目标程序
  2. 监听程序的输出内容
  3. 匹配到预设的提示字符串后,自动发送指定输入
  4. 支持循环监听,完美应对程序的错误重试提示

具体实现步骤

1. 编写Expect脚本

假设你的程序运行时会输出类似这样的提示:

请输入第一个选项:
请输入第二个选项:
(如果输入错误)输入无效,请重新输入:

你可以创建一个名为auto_run.exp的脚本:

#!/usr/bin/expect

# 配置你的程序路径和参数逻辑
set program_path "/path/to/your/target_program"
# 从命令行接收要处理的输入文件路径
set input_file [lindex $argv 0]

# 启动程序并传入输入文件参数
spawn $program_path "$input_file"

# 处理第一个输入:匹配所有可能的提示(正常请求或错误重试)
expect {
    -re {请输入第一个选项:|输入无效,请重新输入:} {
        send "2\r"  # 发送你的第一个选项,注意加\r模拟回车
        exp_continue  # 继续监听,防止程序重试提示时无响应
    }
}

# 处理第二个输入,逻辑和第一个一致
expect {
    -re {请输入第二个选项:|输入无效,请重新输入:} {
        send "4\r"
        exp_continue
    }
}

# 等待程序执行完成
expect eof

2. 赋予脚本执行权限

在终端运行:

chmod +x auto_run.exp

3. 批量处理输入文件

用bash循环遍历所有输入文件,逐个调用脚本:

# 替换为你的输入文件所在目录
for file in /path/to/input_files/*; do
    # 跳过目录,只处理文件
    if [ -f "$file" ]; then
        ./auto_run.exp "$file"
    fi
done

为什么普通管道不行?

普通的echo "2\n4" | program是一次性把所有输入发送给程序,不管程序当前处于哪个提示阶段。如果程序因为输入错误(比如之前的输入没被正确识别,或者程序本身有重试逻辑)重复弹出提示,后续的输入会被提前消耗,导致程序卡在等待输入的状态,自然就停滞了。而expect是按需发送输入,完全匹配程序的交互节奏,不会出现这个问题。

备选方案(仅适用于简单场景)

如果你的程序提示非常固定,且不会频繁重试,也可以用循环配合管道勉强实现,但稳定性远不如expect:

printf "2\n4\n" | while read -r input; do
    echo "$input"
    # 这里可以加个短暂延时,让程序有时间处理输入
    sleep 0.5
done | /path/to/your/target_program input_file

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 04:26:59