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

如何用Expect/Tcl处理Linux程序的无序交互式提示及多轮动态响应?

使用Expect处理顺序不固定的交互式Linux程序

核心实现思路

没错,你需要结合exp_continue和$expect_out来实现对任意顺序提示的监听,同时通过传递动态参数支持多次运行时的不同响应内容。以下是具体技术方案:

完整Expect脚本示例

#!/usr/bin/expect

# 接收外部传入的多组响应数据,格式为:["Name1", "Q1_1", "QB_1", "Name2", "Q1_2", "QB_2"...]
set responses $argv
set run_count [expr {[llength $responses] / 3}]

# 循环多次运行目标程序
for {set i 0} {$i < $run_count} {incr i} {
    # 提取当前运行的响应内容
    set name [lindex $responses [expr {$i*3 + 0}]]
    set q1_ans [lindex $responses [expr {$i*3 + 1}]]
    set qb_ans [lindex $responses [expr {$i*3 + 2}]]

    # 启动目标交互式程序
    spawn ./your_interactive_program

    # 持续监听所有可能的提示,直到程序退出
    expect {
        "Name:" {
            send "$name\r"
            exp_continue ;# 继续监听其他提示
        }
        "Question 1:" {
            send "$q1_ans\r"
            exp_continue
        }
        "Question B:" {
            send "$qb_ans\r"
            exp_continue
        }
        eof {}
    }
}

关键技术点解释

  • exp_continue的作用:每次匹配到提示并发送响应后,不退出expect块,继续监听剩余提示,完美适配提示顺序不固定的场景。
  • $expect_out的扩展用法:如果需要捕获匹配到的具体提示(比如做日志),可以用$expect_out(0,string)获取完整匹配内容,示例:
    expect {
      -re {Name:|Question 1:|Question B:} {
          set matched_prompt $expect_out(0,string)
          switch $matched_prompt {
              "Name:" {send "$name\r"}
              "Question 1:" {send "$q1_ans\r"}
              "Question B:" {send "$qb_ans\r"}
          }
          exp_continue
      }
      eof {}
    }
    
  • 动态响应的实现:通过脚本接收外部参数传入每次运行的响应内容,执行示例:
    expect your_script.exp Bob "Answer Q1" "Answer QB" Joe "Another Q1" "Another QB"
    
    以上命令会让程序第一次运行时Name响应Bob,第二次响应Joe,其他提示同理。

注意事项

  • 确保匹配的提示字符串与程序输出完全一致,若有多余空格/换行,可改用正则表达式(比如-re {Name:\s*})处理。
  • 如需超时控制,可在expect块中添加超时分支:
    timeout {
        puts "程序响应超时"
        exit 1
    }
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 13:21:09