具有多个 shell 语句的期望脚本

A expect script with multiple shell statements

我正在使用 fabric,这是一个仅在 Python2.* 中工作的部署工具,用于将我的博客部署到远程服务器。

但是我的博客是用 Python 3.5 写的,所以我尝试使用 expect 脚本和 pyenv 工具来自动执行部署:

#!/usr/bin/expect
set timeout 10

spawn pyenv global system # changes python to 2.* version
spawn fab build  # gets files zipped

spawn fab deploy
expect "private key:"
send "x\r"
expect "Login password for 'myblog': "
send "*******\r"
expect eof

spawn pyenv global 3.5.1 # changes back

然后我发现只有 spawn pyenv global systemspawn fab deploy 部分有效。

这是因为 spawn fab build 部分不需要任何输入或反馈吗?但如果是这样,就无法解释为什么第一个语句 spawn pyenv global system 起作用了。另外,奇怪的是,最后一条语句失败了。

顺便说一句,当我在命令行中分别 运行 这四个语句时,这很好。

我尝试在每条语句后添加 expect eof,它起作用了:

#!/usr/bin/expect
set timeout 10

spawn pyenv global system
expect eof

spawn fab build 
expect eof

spawn fab deploy
expect "key:"
send "x\r"
expect "password"
send "*******\r"
expect eof

spawn pyenv global 3.5.1
expect eof

也许当你想执行像ls -a这样不需要输入的命令时,你可以在它后面添加expect eof