根据预期的手册页,

match_max
      defines the size of the buffer (in bytes) used internally by expect.

但是,当我用值1调用match_max时, 期望内部一次使用四个字符。 (这可以在exp_internal 1生成的输出中看到。)将match_max设置为2使期望使用7个字节的缓冲区,3定义10个字符的缓冲区,4导致13,以及5到16。

为什么会这样呢?

编辑-在评论中回答问题:

手动启动telnet会话可得到以下输出:

Trying 192.168.xxx.yyy...
Connected to 192.168.xxx.yyy.
Escape character is '^]'.

运行与期望的那样 ,远程登录match_max设置为1:

expect: does "Tryi" (spawn_id exp11) match glob pattern "Login: $"? no
"Password: $"? no
...
expect: does "ryin" (spawn_id exp11) match glob pattern "Login: $"? no
"Password: $"? no

一次考虑四个字符。

match_max 2做同样的match_max 2

expect: does "Trying " (spawn_id exp11) match glob pattern "Login: $"? no
"Password: $"? no 
...
expect: does "ying 19" (spawn_id exp11) match glob pattern "Login: $"? no
"Password: $"? no

缓冲区实际上设置为七个字符。

#1楼 票数:2 已采纳

我刚刚做了测试。 对于较小的数字(大约小于170 ), match_max N实际上表示3N + 1 对于大数, N意味着 2N 多一点 好像expect用一个非常有趣的算法。 :)

$ cat foo.exp
log_user 0
spawn yes hello world
match_max [lindex $argv 0]
set n 0
expect {
    full_buffer {
        send_user "forgotten: [string length $expect_out(buffer)]\n"
        if { [incr n] < 5 } {
            exp_continue
        }
    }
}
$ expect foo.exp 1
forgotten: 4
forgotten: 4
forgotten: 4
forgotten: 4
forgotten: 4
$ expect foo.exp 10
forgotten: 31
forgotten: 31
forgotten: 31
forgotten: 31
forgotten: 31
$ expect foo.exp 100
forgotten: 206
forgotten: 301
forgotten: 301
forgotten: 301
forgotten: 301
$ expect foo.exp 1000
forgotten: 2085
forgotten: 2075
forgotten: 2085
forgotten: 2106
forgotten: 2099
$ expect foo.exp 10000
forgotten: 20220
forgotten: 20169
forgotten: 20436
forgotten: 20566
forgotten: 20326
$ expect foo.exp 100000
forgotten: 200133
forgotten: 200161
forgotten: 200408
forgotten: 200090
forgotten: 200440
$

更新:

只有看到这个expect的源代码( exp_clib.c ):

/* get the latest buffer size.  Double the user input for two */
/* reasons.  1) Need twice the space in case the match */
/* straddles two bufferfuls, 2) easier to hack the division by */
/* two when shifting the buffers later on */

bufsiz = 2*exp_match_max;

  ask by peter.slizik translate from so

未解决问题?本站智能推荐:

2回复

预期的整数,但在语句match_max -d 1000000000 -i $ chassis_spwan_id中得到了“ match_max”

我在代码的这一行中遇到错误,最近我们进行了linux升级,看来TCl或EXPECT包中发生了一些变化,此代码以前在我的脚本中起作用- 码- 错误 我注意到,如果我只给出match_max -d 1000000000那么可以代替match_max -d 1000000000
1回复

当expect_out(缓冲区)大小的内部缓冲区大小超过时,如何从期望中获得完整的输出?

我不知道发生了什么,但我没有从执行的远程命令获得完整的输出可能因为期望内部缓冲区被执行。 这就是我执行它的方式: 我只有当我删除log user 0时才获得完整的输出,但是当我在上面的fucnction sendcommands中使用puts命令时,我得到了大约90%的结果,最后
1回复

TCL /预期-预期时输出未显示在缓冲区中

好吧,所以我在一家电信公司工作,为此我为我们的产品开发了一些自动化测试。 我使用TCL8.4和Expect 5.44.1.15是因为我被录用时被问到。 大多数测试包括使用telnet与我们的产品外壳进行交互。 所以我想出了下面的函数: 基本上,可以使用以下功能: :: c
2回复

期待冲洗缓冲区

我正在编写一个tcl / expect脚本来检查事件的字符串输出,如果找到则执行某些操作。 下面是我的代码, 因此,当我发送$ cmd时,我会得到希望与$ value相匹配的事件。 我想知道是否有一种方法可以防止在此proc之后再次使用Expect时,Expect_out(buffe
1回复

*** 检测到缓冲区溢出 *** /usr/bin/expect 终止

我正在运行一个 tcl 脚本,它调用到多个服务器的 ssh 会话并使其保持活动状态以进行进一步的操作。 但是在对 1023 个服务器执行 ssh 后,我收到以下错误消息。 我已经将软限制和硬限制设置为更大的值,但仍然没有运气。 以下是我尝试过的 Server limit.conf详细信息和多
1回复

关于Expect中的expect_out(缓冲区)

谁能解释之间的区别 通常我更喜欢使用expect_out(buffer) 。 什么是第二个,我们什么时候可以使用它? 有人可以解释一下吗?
1回复

我正在尝试将tcl缓冲区导出到bash变量

我正在尝试将tcl缓冲区导出到bash变量,但我无法使其正常工作。 我希望下面的例子能使我清楚我要完成的工作。 我一定要一个tcl嵌入脚本 <<< >> ===================================== 我一直在
2回复

正则表达式在Expect缓冲区中查找字符串

我正在尝试找到一个正则表达式,该正则表达式可以匹配一串转义字符(一个Expect响应,请参阅此问题 )和一个六位数的数字(第一个字母数字字符)。 这是我需要识别的整个字符串: 最终,我需要提取字符串: 这是我已经拥有的: 我需要标识转义字符以验证它是该屏幕区域中的一