2

我正在编写一个期望脚本来自动化一些测试。为了检测何时发生一般错误(可能发生在测试的任何阶段),而不是在每个命令上重复相同的模式(例如,“重新启动系统”)expect,我决定使用expect_background这种情况。

我对该expect_background命令的理解是,它会在当前活动之前针对所有输入文本进行检查expect。所以,如果两者expect_backgroundexpect在等待相同的模式,我希望(请用双关语;-))这两个动作都会被触发。例如:

#!/usr/bin/expect -f

spawn ./counter.sh

expect_background {
  "5" { puts "expect-bg"; }
}

expect {
  "9" { puts "expect-9"; }
}

expect {
  "20" { puts "expect-20"; }
}

./counter.sh脚本以 1 秒为间隔从 1 计数到 20。根据我上面描述的行为,"expect-bg"应该打印在5and 15expect-9at9"expect-20"at 20。但这是我得到的:

$ ./expect_bg.expect  
spawn ./counter.sh
1
2
3
4
5
expect-bg
6
7
8
9
10
11
12
13
14
15
expect-bg
16
17
18
19
20

为什么会这样?以及如何获得所描述的行为?

4

1 回答 1

0

我可以用expect_beforeand产生你想要的输出exp_continue

#!/usr/bin/expect -f
spawn sh counter.sh
expect_before {
    5 {puts "expect_before"; exp_continue}
}
expect {
    9 {puts "exp_9"}
}
expect {
    20 {puts "exp_20"}
}
$ expect counter.exp 
spawn sh counter.sh
1
2
3
4
5
expect_before
6
7
8
9
exp_9
10
11
12
13
14
15
expect_before
16
17
18
19
20
exp_20

当你有

expect_before {
    5 {puts "expect_before"; exp_continue}
}
expect {
    9 {puts "exp_9"}
}

你实际上有这个:

expect {
    5 {puts "expect_before"; exp_continue}
    9 {puts "exp_9"}
}

如果您省略 exp_continue,则该期望语句以前 5 个结尾,因此您永远没有机会查找 9。

于 2013-10-21T16:38:59.453 回答