Tcl 如何清理expect脚本中以前的expect\u buf

Tcl 如何清理expect脚本中以前的expect\u buf,tcl,expect,Tcl,Expect,我已经编写了一个expect函数来获取命令的输出,我的代码如下所示 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} } } 如果我只调用该函数一次,它将正常工作并返回我想要的内容,但是如果我不间断地连续调用它,它将返回不需

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

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缓冲区(我尝试将其设置为空字符串,但不起作用),或者我可以做些什么来避免此问题?提前感谢。

唐·利布斯对您的场景的建议如下:

有时甚至可以说:

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\u out(buffer)
内容本身,这将从
expect\u out
数组中删除“buffer”索引,该数组可以描述为

unset expect_out(buffer)
当下一个匹配发生时,
expect\u out
数组将更新索引“buffer”,我们可以得到新的
expect\u out(buffer)
值。如果您愿意使用这种方式,请用上述代码替换
expect*


这是一种很好的解决方法,可以得到我们真正想要的东西。你可以采用任何方法。选择权在你。:)

您不需要
-re”\n(.*)\r\n“
来匹配正则表达式吗?因为您使用的是
expect\u out(1,string)
Oops,我的错误,谢谢您提醒我,我已经根据经验确定,取消设置expect\u out(缓冲区)比“expect*”更一致。这篇文章对我帮助很大。Stackoverflow像往常一样不可或缺。