我有以下bash脚本(script.sh):
#!/bin/bash
read -p "Remove? (y|n): " answer
echo "You answered '$answer'."
我想用expect来驱动它。我有以下脚本(expect.exp,在同一目录中):
#!/usr/bin/expect -f
set timeout -1
spawn -noecho ./script.sh
expect "^Remove"
send "y\r"
但它没有按预期工作(双关语)。结果是:
~/Playground$ ./expect.exp
Remove? (y|n): ~/Playground$
因此,期望脚本以某种方式失败了第一个'期望'^删除“'行并立即退出,其余的script.sh不执行。我在这做错了什么? 我一直在关注在线发现的基本教程(带有ftp示例的教程)。我在Kubuntu 12.10上使用期望值5.45。
修改 因此,如果我在最后添加'interact'或'expect eof',它就会改变。但我不知道会发生什么,为什么。有什么帮助吗?
答案 0 :(得分:3)
我看到的两件事:
"^Remove"
是一个正则表达式,但默认情况下expect
使用glob模式。尝试
expect -re "^Remove"
在开发程序时,将exp_internal 1
添加到脚本的顶部。然后期望会告诉你发生了什么。
啊,我发现期望在Tcl's glob patterns之外的^
增加特殊含义。
但是,因为expect不是面向行的,所以这些字符(
^
和$
)匹配当前在期望匹配缓冲区中的数据的开头和结尾(而不是行)
所以你看到的是你发送y\r
然后你希望脚本退出,因为它没有更多的事情要做。当您的脚本退出时,生成的子进程将被终止。因此需要等待生成的孩子先结束:expect eof
答案 1 :(得分:0)
在shell脚本的提示符后,您没有匹配任何文本,因此永远不会打印您生成的进程的缓冲区。脚本结束,生成的进程关闭,这就是故事的结束。
确保expect
具体响应或shell脚本的EOF,然后打印缓冲区。例如:
#!/usr/bin/expect -f
spawn -noecho "./script.sh"
expect "Remove" { send "y\r" }
expect EOF { send_user $expect_out(buffer) }