我希望这个预期脚本永远运行(或者直到打印“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
不想回显之前使用stty
pty 上的命令执行此操作:
stty -echo < $spawn_out(slave,name)
(请注意 周围的空格<
)。显然,这允许您以类似的方式重新设置回显。