proc中expect_after / expect_background的行为是否与全局调用时的行为不同?

时间:2013-05-31 00:44:28

标签: tcl expect

我正在使用expect自动完成一些工作,并且具有以下内容:

# 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_afterexpect_background模式移出程序,那么它就像我一样,预期运行。

为什么在放入程序时它的行为会有所不同?

1 个答案:

答案 0 :(得分:0)

感谢格伦杰克曼的想法!似乎在程序中调用expect_afterexpect_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那会很棒,但是对于遇到同样问题的人来说,这是一个解决方法。添加global spawn_id也应该有效,但我最终使用了这个,因为我有大约5-6个变量,其中一半是我在foo中修改的。