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

如何获取Expect中运行的脚本的退出码

解决Expect中获取Bash脚本退出码的问题

问题根因分析

你遇到的核心问题有两个:

  • Tcl/Expect的正则语法不支持\d作为数字匹配符,你用的"(\d+)"无法匹配到退出码数字,导致后续提取到空值。
  • 直接通过lindex $result 3提取退出码的方式依赖输出格式的稳定性,一旦输出结构变化就会失效。

具体修复方案

方案1:修正正则表达式

把原来的\d替换为Tcl支持的数字匹配语法:

  • 使用[0-9]+匹配数字序列
  • 或者使用Tcl的预定义字符类\p{digit}+(需Tcl 8.5及以上版本)

示例代码:

# 替换原来的正则匹配逻辑
expect -re "exit code: ([0-9]+)"
# 获取匹配到的退出码
set exit_code $expect_out(1,string)
exit $exit_code

方案2:用Expect的wait命令直接获取退出状态

这是更可靠的方式,不需要依赖输出文本匹配:

# 启动bash脚本
spawn bash your_script.sh
# 等待脚本执行结束
expect eof
# wait命令返回子进程状态,格式为{pid exit_code}
set wait_result [wait]
set exit_code [lindex $wait_result 1]
exit $exit_code

排查验证步骤

  1. 先打印$result完整内容,确认输出里是否包含预期的退出码,以及它的位置是否为第3个元素:
    puts "Debug result: $result"
    
  2. 如果正则匹配失败,打印$expect_out内容检查匹配结果:
    puts "Debug expect_out: $expect_out"
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 19:15:35