首页 Expect_手册中文版

Expect_手册中文版

举报
开通vip

Expect_手册中文版 Expect_手册中文版.txt 本文由gunman翻译,只是希望能提供给大家一个更好的学习Expect的机会。第一次做翻译, 其中有不少翻译的有问题的地方,还有一些语句没有翻译,直接写的英文。希望大家能够对 照英文原文学习。 在这里要感谢一位陌生的朋友---zyz(只知道好像是一个四川的MM)。她在翻译工作的前 期,帮我把英文原版的Manpages进行了排版,对我的翻译工作给予了很大的帮助。在此表示 感谢。:) 本来这篇文章应该很早之前就该分享给大家的,可是由于工作关系,翻译之后,一直没有时 间整理。所以直到最...

Expect_手册中文版
Expect_手册中文版.txt 本文由gunman翻译,只是希望能提供给大家一个更好的学习Expect的机会。第一次做翻译, 其中有不少翻译的有问 快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题 的地方,还有一些语句没有翻译,直接写的英文。希望大家能够对 照英文原文学习。 在这里要感谢一位陌生的朋友---zyz(只知道好像是一个四川的MM)。她在翻译工作的前 期,帮我把英文原版的Manpages进行了排版,对我的翻译工作给予了很大的帮助。在此表示 感谢。:) 本来这篇文章应该很早之前就该分享给大家的,可是由于工作关系,翻译之后,一直没有时 间整理。所以直到最近才从新修订了一下。 英文实在太烂了,连我自己都受不了自己了。呵呵。 期待有更多的东西与大家分享。也鼓励大家学习英文。 翻译原文如下: EXPECT(1) 名字: Expect-----能与交互式程序进行“可程序化”会话的脚本语言 大纲: (命令选项概述) expect [ -dDinN ] [ -c cmds ] [ -[f|b] ] cmdfile ] [ args ] 概述: Expect是一种能够按照脚本内容里面设定的方式与交互式程序进行“会话”的程序。根据脚 本内容,Expect可以知道程序会提示或反馈什么内容以及什么是正确的应答。它是一种可以 提供“分支和嵌套结构”来引导程序流程的解释型脚本语言。另外,还可以在随时需要的时 候把控制权交给用户,然后再还给脚本。 ExpectK是Expect和Tk的混合体。它就按照Expect和Tk的方式运行。Expect也可以直接嵌入 到C或是C++程序中(这种情况是不涉及Tcl解释)。请看libexpect(3). Expect的名字是从被UUCP(UNIX到UNIX的拷贝),Kermit(一种文件传输 协议 离婚协议模板下载合伙人协议 下载渠道分销协议免费下载敬业协议下载授课协议下载 , 由哥伦比亚大 学设计)和一些其他Modem控制等程序设计思维大众化的“send/expect”时序理念中得出 的。不像UUCP,Expect已经被广泛应用于很多你可以想像的到的程序和任务当中了。 Expect还能同时和多个程序交互。 例如:下面是一些Expect可以做到的事情 1. 让你的计算机呼叫你,这样你可以不用付呼叫费。 2. 启动一个游戏(例如:rogue),如果不是最佳配置,则一直重新启动,直到是最佳 配置为止。然后把控制权转交给你。 3. 第 1 页 Expect_手册中文版.txt 运行fsck的时候,用”yes”或是”no”来回应fsck的交互问题。在没有预设答案标 准的情况下把控制权返还给你。 4. 连接到另一个网络或是BBS站点,自动收取你的邮件,就像邮件是发往你的当地系统 一样。 5. 在执行rlogin,telnet,tip,su,chgrp等等命令的时候保存“环境变量”,“当前目 录”或是其他一些信息。 有很多原因致使Shell不能完成这样的任务(你自己可以试试看)。而这一切对于Expect 来说都是可以的。一般情况下,当一个程序需要程序与用户进行交互的时候就需要用到 Expect。还需要的一个前提是这种交互必须能程序化(例如:循环结构,选择结构等等,个 人认为必须是有规律可循的)。如果需要的话,Expect还能把控制权返还给用户。同样,用 户也可以在任何时候把控制权还给脚本程序。 用法: Expect通过读取cmdfile(命令文件)来执行一系列指令。只要系统支持“#!“,在Script 脚本文件的首行标明“#!/usr/local/bin/expect –f“,并赋予脚本文件可执行权限,执 行脚本文件就可以(隐含方式或是默认)调用Expect。 当然,上面的路径必须正确地指明Expect解释程序的位置。/usr/local/bin只是一个例子。 -c 选项用来标明需要在执行脚本内容之前来执行的命令。 这条命令(-c选项后的命令)应该用引号括起来,以免在执行时被shell分开解释。 -c选项可能会被反复使用。多条命令可以使用同一个”-c”,命令之间需要用分号隔开。这 些命令会按照它们出现的先后顺序执行。(在Expectk中,”-c”相当于”-command”)。 -d 选项允许输出调试性信息。这些信息主要报告像expect和interact等命令执行时的内部 行为。这个选项与写在脚本开头的”exp_internal 1”具有同样的效果,同时还会打印出 Expect的版本。(strace命令用在跟踪变量声明,trace命令用于跟踪变量的赋值)(在 Expectk中,”-d”相当于”-diag”) - D选项开启交互调试器。后面必须跟有一个整数值作为参数,当值为非零或是按下CTRL+C 的时候(或是遇到断点,或是在脚本中恰好出现其他的调试语句),调试器会在进行下一次 Tcl Procedure前取得控制权。想了解更多信息请参见README文件或是下面的SEE ALSO。( 在Expectk中,这个选项相当于”-Debug”)。 - f 选项指明从哪个文件中读取命令。这个选项是可选的,因为只有当使用”#!”时它才有 可能被用到。而其他选项可以写在命令行中。(在Expectk中,它相当于”-file”)。 默认情况下,命令文件是全部读入内存一并执行的。但有些时候需要每次只读一行。例如: stdin( 标准 excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载 输入)就是这样读取的。如果强制任意文件以这种方式(每次读一行)执行的话 就使用”-b”选项。(在Expectk中,它相当于”-buffer”)。 如果”-“被一个文件名替代,那么脚本就会用读指定文件的方式来替代从标准输入读的方 式。(例如:”./ -“就表示从一个名为”-”的文件中读所需的信息)。 -i 选项使Expect能交互式的提示输入命令,而不是从文件中读取。在遇到文件尾或是执行 第 2 页 Expect_手册中文版.txt 了exit命令时,提示输入命令终止。要了解更多信息请参见下面的interpreter。-i 选项是 假设既不是从一个命令文件读,也没有使用-c选项。(在Expectk中,它相当于” -interactive”)。 -- 是用来为划定选项尾的。当你需要像使用选项一样传一个参数,但希望这个参数不要被 当作选项解释时,就需要用到这个选项。当阻止其他选项时,可以把它放在”#!”行中。例 如:下面的例子会让所有参数(包括脚本文件名)都存储在argv中。 #!/usr/local/bin/expect – 注意:当在”#!”行中使用参数时,必须遵守getopt(3)和execve(2)的规定。 $exp_library下如果有expect.rc这个文件的话,它会自动被加载为资源文件(应该是类似于 标准配置文件,像用户根目录下的.bash_profile文件一样)。除非使用-N选项取消自动加 载。(在Expectk中,它相当于”-NORC”)。这个文件被加载后,紧接着用户根目录下的. expect.rc(~/.expect.rc)会被加载。除使用-n选项取消。如果定义了环境变量DOTDIR, 那么它被认为是存放有.expect.rc文件的目录。然后从这个目录中读取.expect.rc文件。( 在Expectk中,它相当于”-norc”)。这些加载配置文件的动作是出现在执行完-c选项指定 的命令之后。 -v 选项用来打印出版本号,然后退出。(在Expectk中的相应选项是-version)。 可选的参数汇成一列,存放在变量argv中。Argc被初始化为argv的长度(变量个数)。 Argv0被设置为脚本名称(or binary if no script is used)。例如:下面的例子打印出 脚本的名称和前三个参数。 Send_user “$argv0 [lrang $argv 0 2 ]\n” 命令: Expect使用Tcl语言(Tool Command Language).Tcl提供诸如流控制,表达式值和一些其他的 特性。像递归调用,定义函数等等。在这里用到的没有说明的命令都是Tcl命令。 Expect支持一些额外的命令。下面具体描述。除非另外声明,否则命令返回空字符串。命令 按字母顺序排序,这样便于查找。仅管如此,初学者还是觉得按照”spawn , send , expect , interact”这种方式来读比较容易。 注意,Exploring Expect这本 关于书的成语关于读书的排比句社区图书漂流公约怎么写关于读书的小报汉书pdf 中提供了关于”Expect和Tcl”的介绍.这本Manpage手册中也 提供了一些例子.但数量有限,因为这本是做为入门的教材手册使用的. 在本手册中,以E开头的是指Expect程序,小写e开头的是指expect命令. close [-slave] [-onexec 0|1] [-i spawn_id] 关闭与当前进程的连接.大多数交互程序会在它们的stdin(标准输入)中检测到EOF(文件尾), 然后退出.所以通常close也有能力杀死进程.-i选项指定了要杀死的对应于spawn_id的进程. expect和interact都能检测到当前程序的退出,并隐含的执行一个关闭.如果你通过执行” exec kill $pid”来杀死进程的话,那么你就需要再显式的调用一下close. -onexec选项用来确定spawn_id在开始新的spawned process(我将其翻译为监测进程)时是被 关闭还是要被覆盖.如果想保持这个spawn_id打开的话,那么后面的参数需要设为0.一个非零 值将会使spawn_id关闭,并可以将这个spawn_id用于新的进程(默认行为).-slave选项是用来 关闭从属进程.(参见spawn -pty)。如果在连接中止的时候,从属进程还打开的话,那么它将 自动关闭。不管进程是显式的调用或是隐式的被中止,你都需要调用wait命令来清理进程执 第 3 页 Expect_手册中文版.txt 行的残余。Close不会调用wait。因为在关闭进程的时候,并不能保障它“正常退出”(个人 认为,可能是指退出时做相应的清理工作)。要了解更多的信息,请参见wait命令。 debug [[-now] 0|1] 控制Tcl调试器以步进方式执行语句,设置断点等等。在没有参数的情况下,如果调试器没 有运行,返回1,否则返回0。用1做参数时,启动调试器,用0做参数时,停止调试器。如果 连同-now一起使用的话,调试器将立即启动(也就是说,在debug命令当中)。否则调试器 会在执行下一条语句的时候启动。 调试命令不会改变任何的traps。可以参见以-D选项启动Expect(参见上面) 要了解更多关于debugger的内容,请参见README文件和下面的SEE ALSO。 disconnect 从终端关闭与一个克隆进程的连接,但让它在后台继续运行。这个进程将被赋予为单独的进 程组(如果可能的话)。标准I/O被重定向到/dev/null。下面的代码使用disconnect命令使 脚本在后台继续运行。 if [fork]!=0 exit disconnect 下面的脚本需要读取一个密码,然后每小时执行一次,每次执行的时候都要求输入密码。脚 本提供了所需的密码,所以你只需输入一次就可以了。(参见能关闭回显的终端命令)。 send_user "password?\ " expect_user -re "(.*)\n" for {} 1 {} { if [fork]!=0 {sleep 3600;continue} disconnect spawn priv_prog expect Password: send "$expect_out(1,string)\r" . . . exit } 用这种方式,而不是用Shell后台方式来执行程序的好处是,用disconnect可以在关闭前保 存终端参数,然后把它们应用于新的终端中。如果使用&的话,Expect没有机会读取终端参 数,因为在Expect取得控制权的时候,终端已经退出了。 exit [-opts] [status] 使Expect退出或是准备退出。-onexit选项使下一个参数做为退出的句柄被使用。没有参数 第 4 页 Expect_手册中文版.txt 时,返回当前的退出句柄。-noexit选项使Expect准备退出,而不是把控制权暂时返还给系 统。用户定义的退出句柄和Expect内部的句柄都是以同样的方式被返回。接下来将不再执行 Expect命令。这在Tcl扩展环境下执行Expect时非常有用。保留当前的解释器(在Tk环境中的 主窗口)以清除其他的Tcl扩展。如果Expect再次调用exit(这有可能发生),不会返回句柄。 退出时,全部连接将关闭,关闭的动作会被监测的进程检测为“到文件尾”。exit只按照正 常exit(2)的中的语句来执行,不会引发其他的动作。因此监视的进程如果没有检测到“到 文件尾”的话,会继续执行。(能检测更多的情况是很重要的。例如:什么样的信号会发给 监测进程,但这些是由系统决定的,它们放在exit(3)的文档中)。如果被监测的进程继续运 行的话,将会被init继承。当前的状态信息将做为Expect的退出信息返回(如果没有指明的 话,返回信息为0)。退出命令在脚本程序执行的最后才自动隐含的调用。 Exp_continue [-continue_timer] 这个命令可以使expect继续执行而不是正常的返回.默认情况下,exp_continue会重高超时时 钟,-continue_timer选项会阻止时钟重新计数(连续计数). Exp_internal [-f file] value 如果是value非零的话,使接下来的命令将调试信息输出到Expect和标准错误输出.如果是0的 话,输出的信息将会被屏蔽.调试信息包括收到的每条信息和每次尝试用当前输出与脚本中的 模式相匹配的信息.如果设置了输出文件,那么正常的和调试的信息都会被写到这个文件当 中.(忽略上面value选项的值).任何之前打开的调试输出文件将会被关闭.-info选项使 exp_internal返回最近关于non-info参数的描述. Exp_open [args] [-I spawn_id] 它返回对应于原始spawn id的文件描述符.这样这个文件描述符就可以被使用了,就好像这个 文件是被Tcl的open指令打开的一样.(这个spawn id将不再使用,wait指令将不能用在这个进 程.).-leaveopen选项使spawn id保持打开,以便供Expect命令使用. Exp_pid [-i spawn_id] 它将返回对应于当前被跟踪进程的ID.如果使用-i选项,将返回对应于指定的spawn id的进程 ID. Exp_send 它是send的别称 Exp_send_error 它是Send_error的别称 Exp_send_log 它是Send_log的别称 Exp_send_tty 它是Send_tty的别称 Exp_send_user 它是Send_user的别称 Exp_version [[-exit] version] 它用于确保脚本程序与当前的Expect兼容。在没有参数的 第 5 页 Expect_手册中文版.txt 情况下,返回当前Expect的版本.这个版本就会编译到脚本中.如果你确切的知道你的脚本程 序不需要最新版本的特性,可以指定一个以前的版本。 版本号由三个由句点分隔的数字组成.第一个是主序号.对应某一主序号版本的Expect写的脚 本程序,在不同主序号版本的Expect环境下基本不能正常运行.exp_version在主版本不同的 情况下会返回一个错误.第二个数字是次版本号.编写脚本的Expect的次版本号如果比当前的 Expect大的话,可能会用到一些新的特性,在当前的环境下可能不能正常运行.exp_version会 在当主序号相同,但次序号比当前Expect版本大的时候返回一个错误信息.第三个数字在 Expect的版本比较中没有多大作用.它只是当发行版有任何变化的时候会增加.比如说增加一 些新的文档或是做了优化.当升级到一个新的次版本号时,这个数字会被初始化为零.如果使 用了-exit选项,Expect会在当前的版本过期的时候打印一个错误信息,然后退出. expect [[-opts] pat1 body1] ... [-opts] patn [bodyn] 等待直到被监视进程的输出与设定的模式相匹配,或是一个指定的时间过后,或是遇到文件 尾.如果最后的body是空的,那么它将被忽略.最近的expect_before设定的模式会在其他模式 之前被隐含地使用.最近的expect_after设定的模式将在所有其他模式匹配完后才被调用.如 果整个Expect命令的参数超过一行,这个参数可能被分为多行,各行之间用一个”\”连接,以 防被分开解释.在这种情况下,Tcl解释器通常会置换掉”\”.如果一个模式设定为eof.则相 应的语句被在当达到文件尾的时候执行.如果一个模式设定为timeout,那么相应的语句会在 超时时执行.如果没有设定timeout对应的执行语句,将会在timeout时隐含执行空指令.即不 执行任何语句.默认的超时时钟设的是10秒,但可以自己设定.通过”set timeout 30”,可以 将超时时钟设定为30秒.如果设定为-1的话,那么超时时钟将是无穷大,如果一个模式设定为 default,那么相应的语句将会在遇到文件尾或是超时时执行.如果触发了相应的模式,则此模 式对应的语句将会被执行.Expect返回语句执行的结果(或是在没有模式触发的情况下是空字 符串).在多种模式匹配的情况下,第一个匹配的模式对应的语句将被执行. 每次出现新的输出的时候,它们都会依次匹配相应的模式.因此,如果你想测试匹配是否成功, 可以把最后一个模式设定为肯定会出现的东西,例如一个提示符.在没有提示符的情况下,你 需要使用一个timeout模式。模式被定义为三种类型.默认情况下,模式被定义为Tcl的string match(字符串匹配)指令.(这些模式很像C Shell中的正则表达式,它们通常被用来做模糊匹 配).-gl选项保护那些可能被认为是Expect的选项的模式匹配字符串。以”-”开头的所有模 式匹配字符串都需要这样保护起来。(因为默认情况下,以”-”开头的字符串都被保留起来 做为将来的选项)。例如:下面的代码期望一个正确的登录.(注意下面的abort是一个已经在 脚本的其他位置定义好的函数) expect { busy {puts busy\n ; exp_continue} failed abort "invalid password" abort timeout abort connected } 在第四行需要使用引号,因为它包含了一个空格.如果不用引号把模式括起来的话,它会被分 别解释为模式与执行函数.执行同样动作的其他模式同样需要把执行函数的名称写出来(像其 他两个执行”abort”函数的模式),如果使用regexp-style模式的话(看下面的例子),更多关 于建立glob-style模式的信息请参见Tcl手册.regexp模式以-re开头.上面的例子可以用 regexp模式改写成下面的代码: 第 6 页 Expect_手册中文版.txt expect { busy {puts busy\n ; exp_continue} -re "failed|invalid password" abort timeout abort connected } 两种类型都可以被正确匹配。这就是说设置的类型可以不用是整个字符串。可以只匹配头部 或是尾部(就假设其他部分也匹配一样)。用^来匹配字符串头部。用$来匹配字符串尾部。 如果你不希望等待直到字符尾,你可以在监视进程回显字符的中间时刻结束响应。虽然仍能 打印出正确的结果,但最后的输出可能看上去有点混乱。因此如果能够详细描述预期的字符 串尾部的话,还是鼓励使用$来匹配尾部。在许多编辑器中,^和&分别表示首行和尾行。因 为Expect不是基于行缓冲的程序。所以这两个字符分别用来表示当前匹配缓冲区中的头数据 和尾数据。-ex使模式进行精确匹配。这时,不对*,^等字符进行解释(但还是要遵守Tcl的 规则)。Expect patterns are always unanchored. -nocase选项使输出中的大写字符也按小写字符匹配。模式匹配字符串本身改变。在读取输 出进行匹配时,超过2000字符将会强制将前面的字符丢弃。这个数目可以通过match_max来 改变。(但太大的数目会降低匹配的效率)。如果patlist是full_buffer,则在收到 match_max个字节而没有相应的模式匹配成功时,执行full_buffer所对应的语句。不管是否 使用了关键字full_buffer,丢弃的字符都会被写到expect_out缓冲区中。如果patlist是关 键字null。并且空是有效字符(通过remove_nulls指令访问),如果输出是一个单个的ASCII 码0,那么null相对应的语句将被执行。通过glob或是regexp模式是不能来匹配0字符。 在匹配字符串时(或是遇到文件尾,或是缓冲区满full_buffer),任何匹配的或是前面没 有匹配的输出都会被保存在expect_out缓冲区中。匹配到的9个字符分别被放到 expect_out(1,string)至expect_out(9,string)中。如果在模式前使用了-indices选项,那 么,这10个字符的开始字符和结尾字符在字符串中的位置被分别存放在变量 expect_out(X,start)和expect_out(X,end)中。其中X是自然数(应该是0到9)。0( expect_out(0,*))是指整个匹配的字符串,它可以用于glob模式,也可以用于regexp模 式。例如:如果一个进程的输出为“abcdefgh\n”,那么expect “cd”的执行结果和下面的 代码执行结果是一样的。 Set expect_out(0,string) cd Set expect_out(buffer) abcd “efgh\n”被丢弃到输出缓冲区了。如果一个进程的输出是”abbbcabkkkka\n”,那么 expect –indices –re “b(b*).*(k+)”的执行结果和下面语句的执行结果是相同的。 set expect_out(0,start) 1 set expect_out(0,end) 10 set expect_out(0,string) bbbcabkkkk set expect_out(1,start) 2 set expect_out(1,end) 3 set expect_out(1,string) bb 第 7 页 Expect_手册中文版.txt set expect_out(2,start) 10 set expect_out(2,end) 10 set expect_out(2,string) k set expect_out(buffer) abbbcabkkkk “a\n”被丢弃了输出缓冲区中了。含有”*”(和-re “.*”)的模糊匹配的模式会清空输出 缓冲区,不再读取从进程中输出的字符。一般情况下,匹配的输出会被Expect的内部缓冲区 丢弃.可以通过在模式前加上-notransfer选项来避免被丢弃.这个选项在实验时非常有用(为 了方便,可以简写成-not).与匹配输出相对应的spawn id被存储在expect_out(spawn_id)中. -timeout 选项使得Expect使用选项后面的数值做为超时时间,而不是timeout变量中设置的 时间. 默认情况下,设定的模式只与当前进程的输出进行匹配.-i选项使得指定spawn_id或是 spawn_id列的输出与下面列出的所有模式进行匹配(直到下一个-i选项为止).spawn_id列要 么是用空格分隔的一列spawn_id,要么是用变量存储的这要一列spawn_id.例如,下面的例子 中,当前进程与”connected”进行匹配,由变量$proc2指定进程与”busy”,”failed”,” invalid passowrd”进行匹配。 expect { -i $proc2 busy {puts busy\n ; exp_continue} -re "failed|invalid password" abort timeout abort connected } 全局变量any_spawn_id的值是在当前expect中所有-i选项定义的spawn_id进程列的总和.它 用来使这些spawn_id进程列与模式进行匹配。在一些-i选项中可能只给出了spawn_id列,但 没有给出相应匹配模式.(例如,-i选项紧接下来就是另一个-i选项).那么这些spawn_id列将 会去匹配与any_spawn_id相对应的模式. -i选项还可以定义一个全局变量,里面存储着spawn_id列.当变量内容发生变化时,它会被重 新读取.这样就可以在程序执行的时候改变I/O源.以这种方式提供的spawn_id被称为” indirect spawn_id”. Break和continue使流程(例如:for结构,proc函数)按照正常的顺序执行.exp_continue使 expect继续执行而不是像通常一样返回.这对于避免explicit loops(不执行以后有语句,直 接进入下一次循环)和重复的语句很有用.下面的例子是一个自动rlogin的代码片断. exp_continue的使用避免了在rlogin揭示输入密码的时候的再写一个重复的expect语句.(需 要等待第二次提示) expect { Password: { stty -echo 第 8 页 Expect_手册中文版.txt send_user "password (for $user) on $host: " expect_user -re "(.*)\n" send_user "\n" send "$expect_out(1,string)\r" stty echo exp_continue } incorrect { send_user "invalid password or account\n" exit } timeout { send_user "connection to $host timed out\n" exit } eof { send_user \ "connection to host failed: $expect_out(buffer)" exit } -re $prompt } 例如,下面的代码使用户可以在任务完全自动化的情况下,还能引导人机交互.这种情况下,终 端被设置成原始状态.如果按下”+”,那么一个变量的值增加,如果按下”P”,那么向进程发 送几个回车符,或是以其它的方式回应一下.如果按下”i”,那么用户就会从脚本那儿把控制 权收回,来与进程进行交互.在每个情况下,exp_continue都使在执行完当前的动作之后,继续 执行模式匹配. stty raw -echo expect_after { -i $user_spawn_id "p" {send "\r\r\r"; exp_continue} "+" {incr foo; exp_continue} "i" {interact; exp_continue} "quit" exit 第 9 页 Expect_手册中文版.txt } 默认情况下,exp_continue会重置超时时间.如果以带有-continue_timer选项的方式执行 exp_continue的话,超时时钟不会重新启动. Expect_after[expect_args] 它和expect_before的工作方式相同.在expect和expect_after能同时匹配的情况下.进程与 expect命令下面的模式进行匹配.想了解更多的信息请参见expect_before. Expect_background [expect_args] 它和expect有一样的参数列表.但不同的是它是立即返回.一旦有新的输入到达时就开始进行 模式匹配,timeout和default两个模式对于expect_background来说没有意义,它们会被隐含 忽略.否则,expect_background会像expect一样调用expect_before和expect_after的模式匹 配. 当expect_background在执行模式匹配时,对应于这个spawn_id的后台进程将被阻塞.当执行 完成时,后台进程被解开.在后台进程被阻塞期间,还可以在前台以同样的spawn_id执行一个 expect脚本.但在非阻塞情况下是不可能这样做的.在用同一个spawn_id声明一个新的 expect_background时,前一个就会被自动删除.声明一个没有匹配模式的expect_background 将会使相应的spawn_id失去在后台匹配模式的能力. Expect_before [expect_args] 它和expect具有相同的参数列表.但不同的是它立即返回.相同spawn_id最近的 expect_before下的匹配模式会自动隐含的加载到下面的expect命令中.如果其中一个模式匹 配成功了,就好像匹配的模式是列在expect命令本身下面一样.如果expect_before和expect 的模式同时匹配,那么将使用expect_before.如果没有相应的匹配列出来,那么这个spawn_id 将不进行任何模式匹配的动作. 除非使用-i选项强制声明,否则expect_before的模式将与执行expect_before命令时对应的 spawn_id的进程输出进行匹配(而不是有模式匹配成功时的spawn_id).-info选项会返回当前 模式的详细信息.默认情况,它会报告当前的spawn_id的信息。也可以通过指定spawn_id来显 示指定spawn_id的信息. 例如: expect_before –info –I $proc 这样最多返回一个spawn_id的详细信息. The flag -indirect suppresses direct spawn ids that come only from indirect specifications. -all选项使expect_before报告所有spawn_id的信息,而不是单个spawn_id的信息。 expect_tty [expect_args ] 和expect的用法很像,但它是从/dev/tty读取字符串(例如:用户的击键)。默认情况下, 读是工作在精加工缓冲模式下的。因此,每行之后必须以回车结尾,这样expect才能分别识 别它们。读模式(例如行缓冲,等等)可以通过stty命令更改(参见下面的stty命令) expect_user [expect_args] 和expect的用法很像,但它是从stdin(标准输入)读取字符串(例如:用户的击键)。默认 情况下,读是工作在精加工模式下的。因此,每行之后必须以回车结尾,这样expect才能分 别识别它们。读模式(例如行缓冲,等等)可以通过stty命令更改(参见下面的stty命令) 。 第 10 页 Expect_手册中文版.txt Fork 创建一个新进程。这个新进程是当前进程的完整拷贝。成功时,会返回0给新进程,返回新 进程的ID给当前进程。失败时(失败的原因可能是资源匮乏,如交换分区,内存不足等), 返回一个-1给当前进程,没有新进程创建。复制的新进程和它的父进程一样通过exit命令退 出。复制的新进程允许写日志文件。如果不屏蔽大多程序的debugging(调试)和logging( 写日志)功能,结果(个人认为:输出结果或是日志)看起来会显得有点混乱。在多个用户 的情况下,即使是很短暂的pty执行结果,看起来也会很让人混乱迷惑。因此,在监视某个 进程(个人认为是执行spawn)之前执行fork更好一点。 interact [string1 body1] ... [stringn [bodyn]] 返回当前进程的控制权给用户。所以击键会被传给当前进程(就像平时操作一样)。当前进 程的stdout和stderr也会返回(个人认为:可能在脚本执行时,标准输出和标准错误输出是 被重定向到Expect的,因为执行spawn之后,expect会等待进程的输出,包括错误输出)。 String-body被指定为参数。在这种情况下,当有指定的string输入时,对应的body就会被 执行(默认情况,string不会被传给当前进程)。如果没有最后的body部分,那么将执行 interact命令。如果整个interact语句参数过长,超过一行,这些参数会用反斜线连接,分 隔在多行,这样避免了语句在执行时被隔断。这种情况下,在Tcl进行语法解释的时候会忽 略这些反斜线,把这多行做为一条语句来执行。例如,下面的代码举例说明了以 string-body方式执行interact命令。String-body是这样设定的:当你按下Ctrl+Z时, Expect 将挂起,按下Ctrl+A时,用户将会看到屏幕显示“you typed a control A”,并且 也向当前进程发送一个Ctrl+A。当用户按下$时,用户会看到屏幕上显示系统日期。按下 Ctrl+C 时Expect将退出。如果输入”foo” ,用户将在屏幕上看到“bar”,如果输入~~, 那么Expect解释器交互执行。 set CTRLZ \032 interact { -reset $CTRLZ {exec kill -STOP [pid]} \001 {send_user "you typed a control-A\n"; send "\001" } $ {send_user "The date is [exec date]."} \003 exit foo {send_user "bar"} ~~ } 在string-body中,字符是按string在string-body中出现的顺序匹配的。 在不清楚余下的字符是什么的情况下,只是部分匹配的字符是不会被发送到当前进程的。如 果在获得了余下的字符之后,整个字符串没有相应的string-body可以匹配(也就是说整个 字符串在string-body中,没有对应相同的string),除了上面说的匹配字符外,也没有其 他更多的匹配(个人理解:比如整个字符xxxbbccada.第一次提到的匹配字符 xxxbb,string-body中有两个对应的string:string1=xxxbb,string2=xxxbbcc,那么也就是 说整个字符是没有相应的string与之匹配,如果只有string1,没有string2,那也就是“没 第 11 页 Expect_手册中文版.txt 有更多的匹配”,只有xxxbb会发送到当前进程,如果存在string2,那么我们最好把string2 放在string1前面,这样可以先在匹配string2,如果输出字符串中,没有相应的xxxbbcc,然 后再去匹配string1。也就是说把“最大匹配”放在前面),那么只有匹配的字符会发给当 前进程。因此,我们可以把“部分匹配”放在后面,如果整个字符(或是“最大字符”)匹 配失败,我们再进行“部分匹配”。默认情况下,string匹配必须是精确完全匹配。(与之 相反,expect命令默认使用glob-style模式)。-ex选项保证那些可能被解释成interact选 项的string能被正确执行。任何以”-”开头的string都需要使用-ex。(所有以”-”开头 的字符将被做为选项) -re选项强制string按regexp模式解释。这种情况下,像expect会把它的输出存储在变量 expect_out里面一样,interact匹配的字符串也会在存储在变量interact_out中。-indices 选项的作用也和expect中的一样。Eof模式列出了在遇到文件尾的时候要执行的语句。一个 单独的eof模式可能跟在-output选项后面,这样当写输出遇到文件尾的时候,就会触发eof 模式,执行相应的语句。默认的eof行为是返回,所以执行interact命令时,在遇到文件尾 就是返回。Timeout模式介绍了超时(以秒为单位)的概念,并列出了(超时)连续数秒没 有读取到字符后的执行语句。Timeout作用于最近指定的进程。**这里没有默认的 timeout,特殊变量timeout(expect命令里面使用的)对这里的timeout模式没有影响。** 例如,下面的命令可以用于自动退出用户,他们在一小时之内没有输入任何字符,却一直收 到系统消息。 interact -input $user_spawn_id timeout 3600 return –output $spawn_id 如果模式为关键词null,而且null是允许的(通过remove_null命令),则在输出中如果出现 单个的ASCII 0,那么null对应的语句将被执行。在glob和regexp模式下是不可能完成的。 在模式前加上-iwrite选项,将会把匹配成功(或是遇到文件尾)的进程的spawn_id赋值给变 量interact_out(spawn_id)。Break和continue会使控制结构(for循环,子函数等等)按照正 常的方式运行,但return会使interact把信息返回给它的调用函数。Inter_return会使它的 调用函数返回。例如,如果一个子函数foo调用了inter_return,在执行inter_return时, 子函数foo会返回。(这就是说,当interact交互式调用解释器时,如果输入return,那么交 互还将继续,如果输入inter_return,那么interact将返回) 在interact执行过程中,终端工作在“原始状态”下,这样所有字符都将发送给当前进程。 如果当前进程没有捕获到工作流程的信号,那么按下Ctrl+Z会使其中止。如果想重启这个进 程,可以给它发送一个“继续”信号(如执行:"kill -CONT "),如果你真想给当前进 程发送一个“中止”信号,你可以考虑先监视csh,然后再启动你的程序。也就是说,如果 你想发送中止信号给Expect,首先要调出解释器(可能是按一下ESC键),然后按下Ctrl+Z。 为了避免进入解释器,交互式的执行命令,string-body可以用做“速记”,当string-body 对应的body执行的时候,使用的前一个终端模式。为了程序的执行效率,默认情况下,终端 使用原始状态。-reset使终端恢复到interact执行以前的状态(总是“精加工”状态)。注意 的是,在进行终端模式转换的时候,此时输入的字符可能丢失(在一些系统上,会出现这种 糟糕的现象)。最好在你必须使用”精加工”模式再使用-reset选项。-echo选项使与模式进 行匹配的字符同时也被发送给产生这些字符串的当前进程,就好像是当前进程读取到他们一 样。这在当用户希望在执行某些指令需要看到回显的时候非常有用。 如果回显了一个模式,但最终没有匹配成功,这些字符会被发送到监视的进程,如果监视的 进程再把它们显示出来的话,那么用户将会看到他们两次。-echo可能仅仅适合于当用户不 可能不完成模式匹配的情况。例如:下面是摘自于rftp,一个递归式ftp脚本,用户被提示 输入”~g,~p,~l”,以便递归的”获得,上传,查看”当前路径。这些字符和常规的ftp命 令相差太远,用户除非出错,否则基本上不会打出”~”后面跟有某些字符的情况。这种情 况下,他们就可能会忽略了正确的结果。 interact { -echo ~g {getcurdirectory 1} 第 12 页 Expect_手册中文版.txt -echo ~l {getcurdirectory 0} -echo ~p {putcurdirectory} } -nobuffer选项会把进行模式匹配的字符发送给输出进程,就像这些字符是被读取的一样。 这在你想让进程回显模式的时候非常有用。例如,下面的代码监视了哪个用户在拨叫(一种 Hayes模式的Modem),每次都会在脚本的日志文件中后面看到一个”atd”。 proc lognumber {} { interact -nobuffer -re "(.*)\r" return puts $log "[exec date]: dialed $interact_out(1,string)" } interact -nobuffer "atd" lognumber 在交互过程中,log_user的前一个值被忽略了。特别需要说明的是,interact会强制使他的 输出 记录 混凝土 养护记录下载土方回填监理旁站记录免费下载集备记录下载集备记录下载集备记录下载 成日志(输出到标准输出),因为它认为用户不希望没有任何回应的交互。-o选项使 下面的key-body模式应用于当前进程的输出(也就是说用当前进程的输出来匹配模式)。这对 于处理像”在一个telnet会话中输入很多错误字符(个人认为:非命令或是选项字符)”的情 况非常有用。 默认情况下,interact希望用户对标准输入进行写操作,对标准输出进行读操作。-u选项通 过指定进程名(通常是指定一个spawn_id)来使此进程的用户与其他进程进行interact(交互) 。这就使两个毫不相差的进程通过这样一个联系连接起来。为了协助调试,Expect的调试信 息经常会输出到标准错误输出(或是是标准输出,为了记录日志和调试信息)。同样,解释器 也会交互的从标准输入读取字符。例如:下面的代码,建立了一个登录进程,它呼叫用户, 然后使双方连接在一起。当然其他进程也可以取代这里的login进程。一个脚本,允许在不 提供用户名与密码的情况下正常工作。 spawn login set login $spawn_id spawn tip modem # dial back out to user # connect user to login interact -u $login 为了发送输出给多个进程,必须使用-output选项指定spawn_id列表。同样,要给多个进程 输入字符,需要使用-input选项(-input和-output,还有expect中的-i选项都支持列表,除 了特殊变量any_spawn_id在interact命令中无效,在expect中有效)。 所有接下来的选项或字符串(或模式)对当前的输入有效。直到下一个input选项为止。如果 没有-input选项,-output选项暗含表示”–input $user_spawn_id –output”(在不含有 -input选项的模式中也一样)。如果指定了一个-input选项,那么它将覆盖$user_spawn_id, 如果出现第二个–input选项,那么它将覆盖$spawn_id,还有可能会指定更多的-input选 项。 第 13 页 Expect_手册中文版.txt 这两个暗含的输入进程把它们的输出默认分别把$spawn_id和$user_spawn_id作为它们的输 出(做了调换)。如果-input选项后面没有-output,那么这个进程的输入将会被忽略。-i选 项介绍了一种当没有使用-input或是-output选项时的替代方式。-i选项暗含一个-o选项。 使用“间接”spawn_id列可以改变交互进程 (“间接”spawn_id列已经在expect命令里面讲 过) 。“间接”spawn_id列可以通过-i,-u,-input或是-output选项指定。 interpreter [args] 使用户交互的输入Expect或是Tcl命令,每个命令的结果都会被打印出来。 Break和continue会使控制结构(for循环,子函数等等)按照正常的方式运行,但return会使 interact把信息返回给它的调用函数。Inter_return会使它的调用函数返回。例如,如果一 个子函数foo调用了inter_return,在执行inter_return时,子函数foo会返回。其他命令使 interpreter继续提示输入新的命令。默认情况下,提示包含两个整数。第一个表示the depth of evaluation stack嵌套的层数(也就是Tcl_Eval被调用了多少次)。第二个参数是 Tcl的history identifier历史指针。提示符可以通过定义一个叫做”prompt1”的子函数来 设置,这个子函数的输出会成为下一个提示符。如果一条语句中包含半开的(也就是一个, 不是一对儿)引号,大括号,中括号或是小括号,那么下一个提示符会被放在新一行。第二 个提示符同样也可以通过定义一个叫做”prompt2”的子函数来设置。在interpreter执行过 程中,终端使用“精加工”模式,即使它的调用函数使用的是“原始中”模式。如果在没有 使用-eof选项的情况下,标准输入被关闭,那么interpreter就会返回。如果使用了-eof选 项,那么将调用下一个参数。 log_file [args] [[-a] file] 如果指定了文件名,那么log_file命令会把会话的记录写入文件(从执行这条语句开始),如 果没有给定任何参数,那么log_file命令会停止记录。前面的日志文件都将被关闭。不指定 文件名,还可以通过-open或是-leaveopen选项来指定Tcl文件描述符,这和spawn命令的用 法一样(参见spawn命令)。-a选项强制把log_user命令产生的输出记录到日志。默认情况 下,为了在一次会话中能很方便的多次关闭日志记录,log_file命令会把输出信息添加到文 件尾,而不是覆盖原来的内容。如果想覆盖原来的内容,可以使用-noappend选项。-info选 项使log_file命令返回关于最近的non-info(非info选项)参数的描述。 log_user -info|0|1 默认时,send/expect对话会被记录到标准输出中,可以通过log_user 0来禁止,通过 log_user 1来恢复。输出到日志文件维持不变。-info选项使log_user命令返回关于最近的 non-info(非info选项)参数的描述。 match_max [-d] [-i spawn_id] [size] 这个命令定义Expect内部使用的缓冲区大小。如果没有参数,返回当前大小。如果使用-d选 项的话,将缓冲区设置为默认大小(初始的默认大小是2000 Bytes)。如果使用了-i选项,那 么设置的是对应于spawn_id的进程的缓冲区大小。否则设置的是当前进程的。 overlay [-# spawn_id] [-# spawn_id] [...] program [args] 终止当前的Expect程序,执行program args。一个连字符没有指定参数,那么连字符将被放 到命令之前,就像它是一个登录Shell一样。除了那些在命令行中做为参数指定的spawn_id 外,其他将全部被关闭。这些在命令行中指定的spawn_id将被重定向到指定的文件描述符。 这些spawn_id被重定向到文件描述符是为了新程序来继承。例如,下面的命令运行chess程 序,而且允许当前程序--chess master(chess控制者)来控制。 overlay -0 $spawn_id -1 $spawn_id -2 $spawn_id chess 第 14 页 Expect_手册中文版.txt 虽然它牺牲了执行程序化交互的能力,因为Expect已
本文档为【Expect_手册中文版】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_774308
暂无简介~
格式:pdf
大小:217KB
软件:PDF阅读器
页数:23
分类:互联网
上传时间:2013-06-29
浏览量:306