expect-学习文档
2016-02-25 10:45
246 查看
文档出处: Expect :http://www.tcl.tk/man/expect5.31/expect.1.html
-d表示打印出执行信息,脚本内部命令的执行过程;
-D开启调试器
-i表示开启交互
-n表示
-N表示
-c表示先于脚本要执行的命令
-f表示要执行的脚本名字
-b表示
args表示脚本的参数列表
send_user “$argv0 [lrange $argv 0 2]\n”
linux上执行命令(#号后内容为注释,实际执行中没有这些信息,行首的$表示系统提示符):
#改变文件执行权限
$chmod 777 test
$ ls -l
total 1
-rwxrwxrwx 1 username username 41 Feb 25 09:59 test
#执行脚本文件test,打印出文件名及参数ni hao
$ expect -f test ni hao
test ni hao
#执行脚本文件test,打印出文件名及参数ni hao helo,第四个参数world未打印
$expect -f test ni hao helo world
test ni hao helo
#expect兼容tcl语句,-c表示先于脚本要执行的一些命令, -c后的命令要用引号括起来,多条命令用分号分割
$expect -c “puts helloworld;puts nihao” test ni hao helo world
helloworld
nihao
test ni hao helo
#指定-d选项,会打印此次执行的内部过程
$expect -c “puts helloworld;puts nihao” -d test ni hao helo world
helloworld
nihao
expect version 5.45
argv[0] = expect argv[1] = -c argv[2] = puts helloworld;puts nihao argv[3] = -d argv[4] = test argv[5] = ni argv[6] = hao argv[7] = helo argv[8] = world
set argc 4
set argv0 “test”
set argv “ni hao helo world”
executing commands from command file test
test ni hao helo
#-D选项开启debugger,用户可以进行操作,后面要有一个非零数字;按^C会把控制权交给脚本
$expect -c “puts helloworld;puts nihao” -D 1 test ni hao helo world
helloworld
nihao
2: lrange $argv 0 2
dbg2.0>puts $argv
ni hao helo world
dbg2.1> ^C
1: send_user “\$argv0 [lrange \$argv 0 2] \n”
dbg1.2> ^C
test ni hao helo
1: exit 0
dbg1.3> ^C
2: rename _close.pre_expect close
dbg2.4> ^C
$
#-i会开启expect 交互界面,用exit可以退出
$expect -c “puts helloworld;puts nihao” -i test ni hao helo world
helloworld
nihao
expect1.1> puts [lindex $argv 0]
test
expect1.2> exit
alan.yu@dev-18:~/automation_bk$
spawn启动进程时,会产生一个变量spawn_id, 存储了进程的描述符。
send “hello world\r”
表示发送 h e l l o [blank] w o r l d [return]给当前进程。回车符”\r”用于使程序读取行缓存中的字符串。
-i标志表示字符串的目的进程的spawn_id。
-null表示发送Null字符,后面可以跟一个整数,表示发送多少个null。
-break
-s
-h表示模拟人输入字符串的情况,人的输入会有延时,用变量 “send_human”控制。它有五个参数,前两个控制平均间隔,单位为秒,第一个是默认间隔,第二个是词尾的间隔,第三个表示间隔的可变性,(.1表示变化很大,1表示变化一般,10表示变化很小,范围从0到infinity),第四和第五个分别表示最小和最大的间隔。比如
set send_human {.1 .3 1 .05 2}
send -h “I’m hungry. Let’s do lunch.”
表示快速的连续输入。
执行send前一般会执行一个expect, 用于等待进程执行完上一条命令再处理字符串。也可以在send前添加等待时间。
exp_send是send的同义词,不过send在一些工具中,如ExpectTk,意义有差别! exp_send可兼容环境。
expect_before命令指定的pattern会优先与expect的各pattern进行查找,expect_after命令指定的pattern会在查找完expect的各pattern后再进行查找。
整个expect的参数如果是多行,需要用大括号括起来,这样就不用每一行末尾都使用反斜线 \ 了。不过tcl中的substitutions会出现在括号中。
pattern是eof,表示在文件结尾会执行对应的代码;如果是timeout,就表示超时后会执行对应代码,超时时间默认是10s, 可以通过 “set timeout 30” 修改为30s, 设置为-1表示无限等待;如果是default,表示超时或者文件末尾会执行的代码。出现多个匹配的Pattern时,会选择第一个匹配的pattern,并执行对应代码。
1 语法
语法:expect [ -dDinN ] [ -c cmds ] [ -[f|b] cmdfile ] [ args ]-d表示打印出执行信息,脚本内部命令的执行过程;
-D开启调试器
-i表示开启交互
-n表示
-N表示
-c表示先于脚本要执行的命令
-f表示要执行的脚本名字
-b表示
args表示脚本的参数列表
2 示例
linux系统安装了expect程序,根据英文文档,编写了一个文件test文件,打印文件名及后面三个参数:send_user “$argv0 [lrange $argv 0 2]\n”
linux上执行命令(#号后内容为注释,实际执行中没有这些信息,行首的$表示系统提示符):
#改变文件执行权限
$chmod 777 test
$ ls -l
total 1
-rwxrwxrwx 1 username username 41 Feb 25 09:59 test
#执行脚本文件test,打印出文件名及参数ni hao
$ expect -f test ni hao
test ni hao
#执行脚本文件test,打印出文件名及参数ni hao helo,第四个参数world未打印
$expect -f test ni hao helo world
test ni hao helo
#expect兼容tcl语句,-c表示先于脚本要执行的一些命令, -c后的命令要用引号括起来,多条命令用分号分割
$expect -c “puts helloworld;puts nihao” test ni hao helo world
helloworld
nihao
test ni hao helo
#指定-d选项,会打印此次执行的内部过程
$expect -c “puts helloworld;puts nihao” -d test ni hao helo world
helloworld
nihao
expect version 5.45
argv[0] = expect argv[1] = -c argv[2] = puts helloworld;puts nihao argv[3] = -d argv[4] = test argv[5] = ni argv[6] = hao argv[7] = helo argv[8] = world
set argc 4
set argv0 “test”
set argv “ni hao helo world”
executing commands from command file test
test ni hao helo
#-D选项开启debugger,用户可以进行操作,后面要有一个非零数字;按^C会把控制权交给脚本
$expect -c “puts helloworld;puts nihao” -D 1 test ni hao helo world
helloworld
nihao
2: lrange $argv 0 2
dbg2.0>puts $argv
ni hao helo world
dbg2.1> ^C
1: send_user “\$argv0 [lrange \$argv 0 2] \n”
dbg1.2> ^C
test ni hao helo
1: exit 0
dbg1.3> ^C
2: rename _close.pre_expect close
dbg2.4> ^C
$
#-i会开启expect 交互界面,用exit可以退出
$expect -c “puts helloworld;puts nihao” -i test ni hao helo world
helloworld
nihao
expect1.1> puts [lindex $argv 0]
test
expect1.2> exit
alan.yu@dev-18:~/automation_bk$
3 常用命令
1 spawn [args] program [args]
新建一个进程,执行命令program [args] ,返回值是进程的UNIX id。其stdin, stdout and stderr 都和Expect连接,所以可以被Expect的其他命令读写。用close进行关闭当前进程及其相关文件。spawn启动进程时,会产生一个变量spawn_id, 存储了进程的描述符。
2 send [-flags] string
将字符串string发送给当前进程。比如send “hello world\r”
表示发送 h e l l o [blank] w o r l d [return]给当前进程。回车符”\r”用于使程序读取行缓存中的字符串。
-i标志表示字符串的目的进程的spawn_id。
-null表示发送Null字符,后面可以跟一个整数,表示发送多少个null。
-break
-s
-h表示模拟人输入字符串的情况,人的输入会有延时,用变量 “send_human”控制。它有五个参数,前两个控制平均间隔,单位为秒,第一个是默认间隔,第二个是词尾的间隔,第三个表示间隔的可变性,(.1表示变化很大,1表示变化一般,10表示变化很小,范围从0到infinity),第四和第五个分别表示最小和最大的间隔。比如
set send_human {.1 .3 1 .05 2}
send -h “I’m hungry. Let’s do lunch.”
表示快速的连续输入。
执行send前一般会执行一个expect, 用于等待进程执行完上一条命令再处理字符串。也可以在send前添加等待时间。
exp_send是send的同义词,不过send在一些工具中,如ExpectTk,意义有差别! exp_send可兼容环境。
3 expect [[-opts] pat1 body1] … [-opts] patn [bodyn]
用于等待一段时间,直到某个特定的字符(串),或者超时,或者到达文件结尾。expect_before命令指定的pattern会优先与expect的各pattern进行查找,expect_after命令指定的pattern会在查找完expect的各pattern后再进行查找。
整个expect的参数如果是多行,需要用大括号括起来,这样就不用每一行末尾都使用反斜线 \ 了。不过tcl中的substitutions会出现在括号中。
pattern是eof,表示在文件结尾会执行对应的代码;如果是timeout,就表示超时后会执行对应代码,超时时间默认是10s, 可以通过 “set timeout 30” 修改为30s, 设置为-1表示无限等待;如果是default,表示超时或者文件末尾会执行的代码。出现多个匹配的Pattern时,会选择第一个匹配的pattern,并执行对应代码。
相关文章推荐
- 使用order by和rownum时特别注意
- 数组中重复的数字
- 完全卸载Mysql
- Android的进程与线程
- PHP获取Cookie模拟登录
- Maven创建WEB项目
- WebSocket简单介绍 Java后端WebSocket的Tomcat实现
- 靠谱的禁止ViewPager滑动方法
- JCIP-5-Building Blocks
- 如何解决IE9以下的浏览器对html5标签不兼容的问题
- 2016.02.25,英语,《Vocabulary Builder》Unit 02
- Python开发者最常犯的10个错误
- javax.mail.MessagingException: 501 Syntax: HELO hostname
- Mybatis-实体类属性名与数据库字段名不同的查询方法
- H3C 升级软件版本
- GIS+=地理信息+云计算技术——[网络公开课]云GIS解决方案及应用案例
- js判断图片加载完成后获取图片实际宽高的方法
- JavaScript自动生成博文目录导航
- 安卓彩色二维码
- 拷贝一个用户下的所有表和数据到另外一个库