1

我正在使用期望自动化一些工作,并且具有以下内容:

# procedure to set background and after patterns
proc foo {} {
    expect_after {
        -re $regex1 {puts "Matched regex1"; send $command_to_run; exp_continue}
        timeout {exp_continue}
    }
    expect_background {
        -re $regex2 {do other things; exp_continue}
        -re $regex3 {and more different things; exp_continue}
        timeout {exp_continue}
    }
}

spawn $thing
foo
expect_user {
    -ex "stahp" {exit}
}

这在模式匹配后无限期挂起expect_after(并运行关联的主体)。但是,如果我将expect_afterandexpect_background模式移出过程,那么它会按照我的预期运行。

为什么它在放入程序时表现不同?

4

1 回答 1

0

感谢格伦杰克曼的想法!似乎当在过程中调用时,expect_after, expect_background, 并且可能expect_before不仅查找全局范围内的 spawn_id ,而且需要指定它。

这有效:

proc foo {} {
    namespace eval global {
        expect_after {
            -i $spawn_id -re $regex1 {do things}
        }
        expect_background {
            -i $spawn_id -re $regex2 {do more different things}
            -i $spawn_id ...
        }
    }
}

如果有人可以解释为什么它需要-i $spawn_id那将是很棒的,但是对于遇到相同问题的任何人来说,这是一个解决方案。添加 aglobal spawn_id也应该可以,但我最终使用了它,因为我有大约 5-6 个变量,其中一半我在foo.

于 2013-05-31T16:41:34.897 回答