如何正确地预期多个提示

时间:2013-04-26 05:55:47

标签: regex unix tcl expect

我有一个expect脚本,我正在寻找多个提示类型并发送命令作为响应。我知道使用“-re”进行正则表达式匹配,但我想知道实现这一目的的正确方法。

例如,我有这些提示类型:

[user@hostname ~]#
user@hostname --->
/ >
-bash-3.00$ 
cli>

这是检测以上所有内容的正确/充分表达吗?

set multiPrompt "(%|#|cli\>|\$|\-\-\-\>)"
expect -re $multiPrompt
send "$someCommand\r"

另外,我有一个命令列表,其中一些命令会在远程系统上执行后提示更改。由于提示更改,其余命令未被发送,因为我的expect脚本无法检测到更改并执行发送操作。

我要做的是创建一个可能的提示池,以便我的期望脚本发送命令而不会错过任何一个。我的方法是否正确?

2 个答案:

答案 0 :(得分:3)

虽然使用正则表达式来检测提示是正确的,但是当你有如此广泛的可能性时,选择一个好的方法是很棘手的。例如,我打赌这个RE会起作用:

set multiPrompt {[#>$] }

(它只是检测提示的结束,并忽略它之前的所有内容。在提示的末尾几乎总是有一个空格,用于在视觉上区分用户输入的内容。)

然而,问题是这个RE很可能与其他东西相匹配。您可能最好将提示更改为已知且唯一的值(通常通过在远程设备上设置PS1环境变量),以便获得可靠的检测。请注意,这只适用于您没有将提示反馈给用户的情况,这对于某些期望而非其他用途是正确的...

答案 1 :(得分:1)

我知道这是一个旧线程,但对于任何搜索此问题的人,我希望这会有所帮助。我是一个UNIX系统管理员,并且我的程序调用了一些期望的脚本用于各种管理功能。这是我发现的一个适用于我所有用例的解决方案:

set prompt "(%|#|>|\\$ )"

set prompt [string trim $prompt]

[string trim $prompt]处理某些提示在输入前有空格的情况,有些则不会在查看提示时剪掉空格。示例:“密码:”与“密码:”