Tcl 捕获expect脚本上的make错误

Tcl 捕获expect脚本上的make错误,tcl,expect,Tcl,Expect,我正在编写一个expect脚本来进行编译。这是一个多步骤脚本,我尝试捕捉错误并停止脚本(如果有)。 以下是一个示例: set BLD_PASS 1 set BLD_PASS [catch {exp_send "make buildXYZ\r"} output] expect { folder] { if { $BLD_PASS == "0" } { send_user "Build passed on XYZ \n\n" } else { sen

我正在编写一个expect脚本来进行编译。这是一个多步骤脚本,我尝试捕捉错误并停止脚本(如果有)。 以下是一个示例:

set BLD_PASS 1
set BLD_PASS [catch {exp_send "make buildXYZ\r"} output]
expect {
  folder] {
    if { $BLD_PASS == "0" } {
       send_user "Build passed on XYZ \n\n"
    } else {
        send_user "Build failed on XYZ\n\n"
        exit
    }
  }
}
问题是我总是把BLD_PASS设为0,即使是在真正失败的时候。 如我所见,set命令被执行,BLD_过程立即获得值,尽管“make”需要几分钟才能完成。所以,它看起来并不是真的得到make的输出

我已经通过在bash脚本中使用“make”验证了它是否输出了正确的返回代码

谁能帮我解决这个问题?谢谢你的帮助。
如果您需要更多信息,请告诉我。

您的代码不起作用的原因是发送本身成功:它将消息发送到了另一端。只是还没有得到结果。要做到这一点,最简单的方法可能是让对方报告退出状态,然后倾听

send "make buildXYZ; echo FROGBARGLE_\$?_BARGLEFROG\r"
expect {
    -re {FROGBARGLE_([^\s_]+)_BARGLEFROG} {
        puts "exit code was $expect_out(1,string)"
    }
}

有更奇特的方法来追踪这类事情,而FROGBARGLE_…\u BARGLEFROG可能有点太武断了;我认为这在make output中不太可能发生,但这种事情通常是远程工作时的方式:您必须告诉对方发生了什么。

您无法从类似的远程命令中获取退出状态。你必须做一些痛苦的事情,比如发送echo\$?\r并解析输出。一个更好的策略是寻找错误消息,或者寻找错误消息的缺失。