请问如何在 expect 脚本中捕获执行的 bash 脚本错误
因为在自动化部署时脚本,需要使用 expect 进入服务区
部署系统中执行的结果 exit 1
会作为失败原因
使用 expect 做自动化脚本时,可能存在执行 bash 脚本文件的情况
在 bash 脚本中异常进行 exit 1
处理,expect 作为外层如何捕获这个错误信息
expect 脚本如下图所示
set COMMAND_EXPECT "#"
spawn ssh -p $SSH_PORT $USER@$HOST; expect $COMMAND_EXPECT;
expect $COMMAND_EXPECT;
for {set i 0} {$i < $argc} {incr i} {
set CMD [lindex $argv $i]
send "$CMD\r";expect $COMMAND_EXPECT;
}
如服务区中存在 restart.sh
脚本,传递给 send $CMD进行了执行
在 send 脚本执行过程中可能会出现异常,如文件名不存在、权限不足等原因
在 send 后如何捕获异常,好在 expect 脚本中继续返回 exit 1
,部署系统能检测到 expect 的异常并告知发布失败
尝试在 bash 脚本 exit 1 时输出规定内容进行 expect 捕获
不过这个方法 硬编码到 bash 脚本中 如果脚本不可控或者 exit 很多不太合适
echo 'CMD_ERROR'
exit 1
expect {
'CMD_ERROR' { exit 1}
COMMAND_EXPECT { .. }
}
看了很多答案使用 catch wait result
测试会卡死在哪里
spawn true
expect eof
catch wait result
exit [lindex $result 3]
https://stackoverflow.com/que...
最终解决方案
执行 send $?\n
输出执行脚本执行返回值,然后再进行 expect 多分支判断退出
send "echo $?\r"
expect {
"0" { send_user "exec success" }
$COMMAND_EXPECT { send_user "exit 1" }
}
send "echo $?\r"
expect -re "(\\d+)" {
set result $expect_out(1,string)
}
send_user "command exit with result code : $result"