【问题标题】:how to clean up the previous expect_buf in an expect script如何在期望脚本中清理以前的 expect_buf
【发布时间】:2014-08-30 14:47:38
【问题描述】:

我已经编写了一个期望函数来获取命令的输出,我的代码如下所示

proc do_cmd {cmd id} {
  set spawn_id $id
  send "$cmd\r"
  expect "$cmd\r"
  expect {
    -re "\n(.*)\r\n" {return $expect_out(1,string)}
    default {exit 1}
  }
}

如果我只调用该函数一次,它会正常工作并返回我想要的东西,但如果我连续调用它而不中断,它会返回一些不需要的东西。

# test case 1
set ret [do_cmd $mycmd $spawn_id]
puts "$mycmd returns $ret"  # the return value is ok

# test case 2
set ret [do_cmd $mycmd $spawn_id]
set ret [do_cmd $mycmd $spawn_id]
puts "$mycmd returns $ret"  # the return value is not something I want

我使用'exp_internal 1'调试它,发现第二个调用命令中的expect_out仍然保留了之前的输出信息并导致匹配问题,那么我该如何清理expect_out缓冲区(我试图设置它一个空字符串,但它不起作用,)或者我还能做些什么来避免这个问题?提前致谢。

【问题讨论】:

  • 你不需要-re "\n(.*)\r\n" 来匹配正则表达式吗?因为您使用的是expect_out(1,string)
  • 糟糕,我错了,谢谢你提醒我

标签: tcl expect


【解决方案1】:

Don Libes 对您的方案的建议如下,

有时候说起来也很有用:

expect *

这里的 * 匹配任何东西。这就像说,“我不在乎什么是 在输入缓冲区中。扔掉它。”这种模式总是匹配的,即使 如果什么都没有。记住 * 匹配任何东西,而空的 字符串是什么!作为这种行为的必然结果,这个命令 总是立即返回。它从不等待新数据到达。它 不需要,因为它匹配所有内容。

参考:Exploring Expect

在这种情况下,在您需要匹配之后,最好尝试将匹配保存到某个变量,然后只需在最后添加代码expect *。这将清空缓冲区。您的代码可以更改如下。

proc do_cmd {cmd id} {
  set spawn_id $id
  send "$cmd\r"
  #Looks like you are looking for a particular command to arrive
  expect "$cmd\r"
  #Then you have one more expect here which is you want to get it
  expect {
    #Saving the value sub match to the variable 'result'
    -re "\n(.*)\r\n" {set result $expect_out(1,string)}}
    }
  #Causing the buffer to clear and it will return quickly
  expect *
  return $result
}

除此之外,还有另一种方法可以取消设置expect_out(buffer) 内容本身,这将从expect_out 数组中删除“缓冲区”索引,可以描述为

unset expect_out(buffer)

当下一次匹配发生时,expect_out 数组将更新索引“缓冲区”,我们可以获得新的 expect_out(buffer) 值。如果您更喜欢使用这种方式,请将expect * 替换为上述代码。

这是一种非常有效的解决方法,可以得到我们真正想要的东西。您可以继续使用任何方法。选择是你的。 :)

【讨论】:

  • 我根据经验确定取消设置 expect_out(buffer) 比“expect *”更加一致。这篇文章对我帮助很大。 Stackoverflow 一如既往地不可或缺。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-08-31
  • 2014-09-20
  • 2016-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多