嗨,全部
我刚刚找到导致这些奇怪事情的原因。这是命令: 发送“等待”
我写了一些脚本来测试它。
proc Login {pass} {
# send the password
}
proc Wait {} {
expect "*]$*"
sleep 1
}
proc sendl {message} {
send "$message\r"
}
spawn ssh xxxxx.xxx.xxx
Login xxxxxxxx
Wait
sendl "cd /somepath/"
Wait
sendl "expect infiniteLoop.exp >/dev/null &"
Wait
***sendl "wait"***
Wait
sendl "TESTTEST"
Wait
sendl "HAHAHA"
Wait
sendl "DONEDONEDONE"
Wait
它应该停留在该行之后: sendl“wait”
但结果是:
[xxx@xxxxx.xxx ~]$ cd /somepath/
[xxx@xxxxx.xxx folder]$ expect infiniteLoop.exp >/dev/null &
[1] 27260
[xxx@xxxxx.xxx folder]$ wait
TESTTEST
HAHAHA
DONEDONEDONE
[xxx@xxxxx.xxx folder]$
shell仍在等待,但后续命令已经逐个发送而没有任何响应。该行之后的所有期望命令似乎都是无效的。然后脚本完成了。
我不知道这里发生了什么。什么原因导致命令无效?命令“wait”似乎不是一个程序(我不能使用“whereis wait”找到它。)
答案 0 :(得分:0)
[xxx@xxxxx.xxx folder]$ wait
TESTTEST
HAHAHA
DONEDONEDONE
这种输出可能是由于期望超时造成的。
我不确定infiniteLoop.exp在做什么。如果它实际上是一个无限循环(或需要很长时间的事情),则以下wait
shell命令将始终等待,因为进程(infiniteLoop.exp)永远不会终止。
因此,以下Wait()
proc调用最终会在每10秒后超时(10秒是Expect默认超时)并且脚本继续如下:
sendl "TESTTEST" (send message to spawned process)
Wait (process still waiting for infiniteLoop.exp, timeout after 10s.)
sendl "HAHAHA" (continue to send message)
Wait (process still waiting for infiniteLoop.exp, timeout after 10s.)
sendl "DONEDONEDONE" (continue to send message)
当Expect脚本没有按预期进行调整时,我总是做两件事:
第一个是手动运行程序以检查是否有错误。
第二个是添加 -d 选项以打开调试消息(例如:expect -d hello.exp
)。
如果你看到“期望:超时”之类的东西,那么之前的模式可能无法匹配。
顺便说一下,您可以添加一点检查以指示超时情况
proc Wait {} {
expect {
"$" {}
timeout {send_user "expect timeout\n"}
}
sleep 1
}