Expect脚本:如何获取命令返回值并在非0时退出脚本?
Expect中获取命令返回值的正确方式
问题分析
- 你原脚本中用
&让命令后台执行,shell会立即返回提示符,此时命令还在后台运行,根本无法获取它的退出码。 - 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á
相关产品推荐
相关产品推荐

