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

转义码^[[43;1R导致bash-expect脚本执行中断求助

Expect脚本处理交互式输入时终端转义码导致中断的解决方案

问题分析

你遇到的^[[43;1R是终端的**光标位置报告(CPR)**控制字符,这类转义码是终端向Expect回显的交互信号,会干扰Expect对预期提示符的匹配,导致脚本无法正确识别"YOUR CHOICE"等输入提示,最终引发中断。另外你的脚本存在一处语法错误,可能加重了问题:第一个send命令里多余的括号会导致shell执行无效命令,干扰后续流程。

修复步骤

1. 修正脚本中的语法错误

将第一个expect块中的send命令:

send "(./(installation.sh) my_argument)\r"

改为正确的命令格式:

send "./installation.sh my_argument\r"

2. 设置哑终端类型,禁用光标报告

在spawn命令前添加终端类型设置,让终端不发送这类控制转义码:

set timeout -1
set env(TERM) dumb  # 添加这一行
spawn $env(SHELL)

dumb终端是最简终端类型,不会产生光标位置报告等额外控制字符,能避免转义码干扰Expect的匹配逻辑。

3. 优化脚本结构:直接spawn安装脚本(推荐)

当前脚本先启动shell再执行安装脚本,多了一层交互环节,容易引入终端环境问题。可以直接spawn目标安装脚本,简化流程:

#!/bin/bash

expect <<'EOF'
set timeout -1
set env(TERM) dumb
spawn ./installation.sh my_argument  # 直接启动安装脚本
expect {
    "*Accept this solution?*" {
        send -- "y\r"
        exp_continue
    }
    "*Do you want to continue?*" {
        send -- "y\r"
        exp_continue
    }
    "*Would you like to setup prompt server reservation using rsync?*" {
        sleep 1
        send -- "N;\r"
        exp_continue
    }
    "*Your choice*" {
        sleep 1
        send -- "\r"
        exp_continue
    }
    "*Enter a list of hosts which should be available to the database*" {
        sleep 1
        send -- "127.0.0.1;\r"
        exp_continue
    }
    eof {  # 用eof匹配脚本执行结束,替代原有的#提示符匹配
    }
}
EOF

这里将最后匹配的"#"替换为eof,因为直接spawn安装脚本时,脚本执行完成后会直接退出,触发eof信号,比匹配shell提示符更可靠。

4. 忽略转义码的匹配规则(备用方案)

如果无法修改终端类型,可以在匹配模式中加入对转义码的处理,先捕获并忽略光标位置报告:

expect {
    "\033\\[[0-9;]*R" { exp_continue }  # 匹配并忽略光标位置报告转义码
    "*Accept this solution?*" {
        send -- "y\r"
        exp_continue
    }
    # 其他匹配块保持不变
    "*Your choice*" {
        sleep 1
        send -- "\r"
        exp_continue
    }
    # ...
}

这个方法会先处理所有光标位置报告转义码,再匹配实际的输入提示,避免转义码干扰后续逻辑。


内容的提问来源于stack exchange,提问作者Наил Рустамов

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 09:07:36