如何获取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
排查验证步骤
- 先打印
$result完整内容,确认输出里是否包含预期的退出码,以及它的位置是否为第3个元素:puts "Debug result: $result" - 如果正则匹配失败,打印
$expect_out内容检查匹配结果:puts "Debug expect_out: $expect_out"
内容的提问来源于stack exchange,提问作者dukul
相关产品推荐
相关产品推荐

