为什么在使用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的相关描述。
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的相关描述。
相关文章推荐
- MySql使用过程中常常遇到的一些问题
- CSVN(SVN)命令入门及使用过程中遇到的错误问题汇总
- 使用 SDL 过程中遇到的两个问题: 找不到main函数 和 链接错误
- Kafka实际使用过程中遇到的一些问题及解决方法
- 关于webuploader插件使用过程遇到的小问题
- 关于尝试GUI的简易使用过程中遇到的问题1
- Ubuntu(17.04)使用过程中遇到的问题以及解决方法
- linux find 命令中 如何使用正则表达式,为什么经常找不到想要的文件名
- tensorflow使用过程遇到的问题
- imgbox使用过程中遇到的问题分享
- 关于dwz框架查找带回使用过程中遇到的问题
- OA系统使用过程中遇到安全问题如何解决
- beetl使用过程中遇到的问题
- 在eclipse中使用evosuite遇到了一些问题,提示windows找不到文件
- Android中webview在使用过程中会遇到的一些问题
- Android studio使用过程中遇到的问题
- delphi 遇到Line too long(more than 1023 characters问题,将原有代码分离出过程来调用,调用使用 过程名字(self) 调用
- Hibernate | Spring JPA | MySQL 使用过程遇到的一些问题
- iOS开发工具-如何使用网络封包分析工具Charles,通过配置proxy对http、https、tcp、udp 等协议的请求响应过程交互信息进行分析、判断、解决我们移动开发中的遇到的各种实际问题。
- Ibatis使用过程中遇到的问题。