无限循环

无限循环

我希望这个预期脚本永远运行(或者直到打印“ok”),但是它却没有运行,而是立即退出。

#!/usr/bin/expect

set timeout 180

spawn ssh -o "StrictHostKeyChecking no" [email protected]
expect "password: "
send "[lindex $argv 1]\n"
expect "$ "

send { while true ;
do
   sleep 1s
   STRLIST=`echo pippo`
   [[ ${#STRLIST} -ge 20  ]] && echo ok && break
done
}
expect "ok"

send {echo Finished! }

send "exit\n"

看起来,无限循环以某种方式在单独的线程中进行,并且在进入(和退出)循环后根本不打印任何内容。

编辑:这是一个实际有用的脚本的简化版本。STRLIST 内容随着每次迭代而变化,我想在条件满足时退出循环。但脚本却立即退出循环,我不知道为什么。

EDIT2:看起来问题是这样的:

期望:" while true ;\r\n> do\r\n> sleep 1s\r\n> STRLIST= echo pippo\r\n> [[ ${#STRLIST} -ge 20 ]] && echo ok && break\r\n> done\r\n" (spawn_id exp4) 是否与 glob 模式 "ok" 匹配?是

“ok”包含在我自己的命令中。

答案1

正如您最后看到的,您发送给生成的命令的内容首先会被回显。这对于 tty(您的终端)来说是正常的,并且会被 创建的 pty 继承spawn

你可以记住在你的模式中处理这个问题expect,或者如果回声没用的话,干脆把它关掉。这样做通过spawn设置全局变量stty_init

set stty_init -echo

或者,您可以稍后在send不想回显之前使用sttypty 上的命令执行此操作:

stty -echo < $spawn_out(slave,name)

(请注意 周围的空格<)。显然,这允许您以类似的方式重新设置回显。

相关内容