gpt4 book ai didi

linux - 期待剧本。使用[发送 "wait"]后事情变得奇怪

转载 作者:太空宇宙 更新时间:2023-11-04 04:21:33 26 4
gpt4 key购买 nike

大家好

我刚刚找到了造成这些奇怪事情的原因。这是命令:发送“等待”

我编写了一些脚本来测试它。

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还在等待,但后续命令已经一一发出去,没有任何反应。该行之后的所有期望命令似乎都是无效的。然后脚本就完成了。

我不知道这里发生了什么。什么原因导致expect命令无效?命令“wait”似乎不是一个程序(我无法使用“whereis wait”找到它)。

最佳答案

[xxx@xxxxx.xxx folder]$ wait
TESTTEST
HAHAHA
DONEDONEDONE

这种输出很可能是expect超时造成的。

我不确定infiniteLoop.exp在做什么。如果它实际上是一个无限循环(或需要很长时间的事情),则以下 wait shell 命令将始终等待,因为进程(infiniteLoop.exp)永远不会终止。

因此,以下 Wait() 过程调用最终将在每 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)。如果您看到类似“expect: timed out”的内容,则先前的模式可能无法匹配。

顺便说一句,您可以添加一些检查来指示超时情况

proc Wait {} {
expect {
"$" {}
timeout {send_user "expect timeout\n"}
}
sleep 1
}

关于linux - 期待剧本。使用[发送 "wait"]后事情变得奇怪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12634787/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com