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

Expect脚本:如何获取命令返回值并在非0时退出脚本?

Expect中获取命令返回值的正确方式

问题分析

  1. 你原脚本中用&让命令后台执行,shell会立即返回提示符,此时命令还在后台运行,根本无法获取它的退出码。
  2. Expect中的$?不是shell的命令返回值,它代表上一个expect命令的匹配状态(成功为0,失败为1),和shell的$?完全不是一回事,这也是报错的核心原因。

正确实现方式

要获取远程命令的退出码,需要让命令前台执行,然后通过shell的$?获取返回值并传递给Expect,具体有两种简洁写法:

写法一:分两次发送命令

先执行目标命令,再发送echo $?获取退出码:

# 去掉&,让命令前台执行
send "./$SCRIPT_NAME >> out.txt\r"
expect "~#"
# 发送echo命令获取上一条命令的退出码
send "echo \$?\r"
# 匹配输出中的数字(退出码)
expect -re {(\d+)\r\n~#}
# 提取捕获到的退出码
set ret $expect_out(1,string)
# 判断退出码非0则退出脚本
if { $ret != 0 } {
    exit $ret
}

写法二:合并命令一次发送

把目标命令和获取退出码的命令放在同一行,减少交互次数:

send "./$SCRIPT_NAME >> out.txt; echo EXIT_CODE=\$?\r"
# 匹配自定义标记后的退出码
expect -re {EXIT_CODE=(\d+)\r\n~#}
set ret $expect_out(1,string)
if { $ret != 0 } {
    exit $ret
}

关键注意点

  • 必须去掉后台执行的&,否则shell不会等待命令结束,无法获取有效退出码。
  • Expect中没有直接对应shell$?的内置变量,需要通过shell主动输出退出码,再用expect -re捕获提取。

内容的提问来源于stack exchange,提问作者Alexandra Krnčová

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 03:20:05