期待退出太快

时间:2013-05-09 09:28:21

标签: expect

我有以下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',它就会改变。但我不知道会发生什么,为什么。有什么帮助吗?

2 个答案:

答案 0 :(得分:3)

我看到的两件事:

  1. "^Remove"是一个正则表达式,但默认情况下expect使用glob模式。尝试

    expect -re "^Remove"
    
  2. 在开发程序时,将exp_internal 1添加到脚本的顶部。然后期望会告诉你发生了什么。


  3. 啊,我发现期望在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) }