您的位置:首页 > 其它

为什么在使用expect的过程中常常遇到spawn命令找不到的问题,谈谈我的例子

2013-11-07 16:57 661 查看
Expect是一个用来实现自动交互功能的软件套件 (Expect [is a] software suite for automating interactive tools)。

expect等待输出中输出特定的字符,通常是一个提示符,然后发送特定的响应。

#!/usr/bin/expect

spawn ./interac.sh

expect "Enter number:"

send "1\n"

expect "Enter name:"

send "sanwu\n"

expect eof

以上面的代码为例,expect等待./interac.sh脚本文件的输出字符Enter number:和Enter name:,并发送特定的相应 1 和sanwu。

在上面的代码中,因为我们是对于expect的隐式调用,所以需要在第一行声明对于本脚本代码的解释器。对于的expect的显式调用为在终端中键入:expect auto.sh(auto.sh为本脚本的文件名)。需要各位注意的是#!/usr/bin/expect必须放在本文件中代码的第一行。本人在vim的配置中对于sh脚本在文件生成过程中,会产生对应的文件头部分的注释,对应的文件内容如下:

#########################################################################

# File Name: auto1.sh

# Author: mahao

# mail: mahao@hust.edu.cn

# Created Time: 2013年11月07日 星期四 21时12分43秒

#########################################################################

#!/usr/bin/expect

spawn ./interac.sh

expect "Enter number:"

send "1\n"

expect "Enter name:"

send "sanwu\n"

expect eof

文件名为:auto1.sh

对于上面的脚本代码的执行结果如下:

(1)显式调用:

Fighting!root@:~/work#chmod a+x auto1.sh

Fighting!root@:~/work#expect auto1.sh

spawn ./interac.sh

Enter number:1

Enter name:sanwu

You have entered 1 sanwu

(2)隐式调用

Fighting!root@:~/work#./auto1.sh

./auto1.sh: 行 8: spawn: 未找到命令

couldn't read file "Enter number:": no such file or directory

./auto1.sh: 行 10: send: 未找到命令

couldn't read file "Enter name:": no such file or directory

./auto1.sh: 行 12: send: 未找到命令

couldn't read file "eof": no such file or directory

由于文件头的注释部分的存在,导致对于expect的隐式调用未能正确执行。

如果将#!/usr/bin/expect 放在文件的第一行,位于文件头注释的前面,隐式调用也能正确执行。

由此可见对于隐式调用而言,必须将#!/usr/bin/expect
这句声明语句放在文件的首行。

spawn是expect的内建命令,只有进入expect环境后才可以执行的expect内建命令。它主要的功能是给调用expect的运行进程加个壳,用来对于输出和特定响应之间的指令传递。

另外,使用脚本语言的参数传递等功能能够实现特定相应的选择,以及相应延时等等更为复杂的功能,具体可以参见man expect的相关描述。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: