如果输出不匹配,如何使Expect的Expect命令失败?

时间:2019-10-03 14:16:22

标签: bash tcl expect

给出非常简单的脚本script.expect

#!/usr/bin/expect

spawn bash
expect "#"
send "/bin/false; echo \"process returned with $?\"\r"
expect -exact "process returned with 0"
send -- "exit\r"
expect eof

由于/bin/false将导致echo命令打印process returned with 1,因此我似乎无法使脚本失败,因此process returned with 0永远不会匹配在expect命令中。我希望expect script.expect会在expect -exact "process returned with 0"之后失败,返回代码1。

#!/usr/bin/expect

spawn bash
expect "#"
send "/bin/true; echo \"process returned with $?\"\r"
expect -exact "process returned with 0" {
  send -- "exit\r"
  expect eof
  exit 0
}
exit 1

即使我更改了“应用程序”的逻辑以便能够以正/逻辑否定的流程对其进行测试,结果仍然无法解释。

我经历了

并且不知道为什么expect如此行事。

1 个答案:

答案 0 :(得分:3)

在您的第一个脚本中,expect -exact...命令在超时的情况下“成功”执行。默认超时为10秒,默认的超时操作为不执行任何操作。因此,这些命令等待10秒,匹配超时,然后返回,因此我们继续执行下一个命令。

您可以明确匹配超时:

expect {
    -exact "process returned with 0" {}
    timeout { puts "timeout!"; exit 1 }
}

为避免等待超时,可以使用正则表达式,该正则表达式将与$?是0还是1(或其他数字)相匹配。如果将部分正则表达式放在捕获组()中,则可以在内置变量$expect_out(1,string)中找到它:

expect -re {process returned with ([0-9]+)}
set returncode $expect_out(1,string)
puts "we got $returncode"
exit $returncode

请注意,正则表达式使用{}样式的引号,因为""引号不允许您在其中使用[]