expect 执行脚本如何捕获错误

请问如何在 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"
阅读 5k
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进