expect-1

 命令

expect使用Tcl(Tool Command Language)。Tcl提供流控制(如if, for, break),表达式计算和一些诸如递归,过程定义等其它性能这里用到但没有定义的命令(如set, if, exec)都是Tcl命令。(参见tcl(3))。
Expect正如下面描述的支持更多一些命令。除非特别说明,命令都是返回空串。
命令以字母表序排列以便他们能被快速定位。然而,新手也许会觉得从spawn, send, expect和interact着手会更容易。
注意最好的语言介绍(expect和tcl)还是《exploring expect》(见SEE ALSO)这本书。手册页中包括有例子,但因为手册页只是基础的参考资料所以它们也是很有限的。
注意本手册中Expect表示Expect程序而expect表示Expect程序中的expect命令。(word很讨厌,总是会自己变大小写,所以翻译过来也比较乱,我也没有刻意去改,读者自己区分吧。)
 
close [-slave] [-onexec 0|1] [-i spawn_id]关闭与当前进程的连接。很多交互式的程序会检测到exit和它们的stdin上的EOF,因此close通常能够杀死进程。-i参数表示关闭与spawn_id通讯的进程。
expect和interact会检测到当前进程的退出并进行被动的close。但是如果你是用“exec kill $pid”的方法kill进程,那就需要主动地调用close。
-onexec参数决定是否关闭所有新spawn的进程的spawn id或是否进程被覆盖。保持spawn id打开,使用0参数。一个非零值将会强行关闭所有新进程中的spawn。
-slave参数关闭与spawn id相关的子spawn进程(参见spawn –pty)。当连接关闭后,如果子spawn进程仍是打开的话则自动关闭。
不论连接是主动还是被动关闭的,你都应该调用wait来清空通信的内核进程区。因为无法保证关闭一个进程连接就会使进程退出,因此Close是不会去调用wait的。
 
debug [[-now] 0|1]
使用tcl debugger允许你跟踪你的程序语句,设置断点等。
不带参数,如果debugger没有运行则返回1,否则返回0。
带1参数,则启动debugger。带0参数,则停止debugger。如果-now后带1,则立即启动(在debugger命令中),否则debugger将开始下一条tcl语句。
Debug命令不会改变任何陷阱,可以和expect –d比较一下。关于debugger还是看它的README和SEE ALSO吧。
 
disconnect
从终端断掉一个fork的进程。它将继续在后台运行。进程给出自己的进程组(如果可能的话),标准I/O被重定向到/dev/null。
下面一段使用disconnect让脚本继续在后台运行:
if {[fork]!=0} exit
disconnect
. . .
下面脚本读取口令,然后每小时运行一个每次运行都需要口令的程序。这个脚本可以让你只用输入一次口令。(参见stty命令获知怎样关闭口令回显)
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
}
在和进程异步(如&参数的进程)的脚本中使用disconnect的一个优点就是Expect能在断开连接之前保存终端的参数并且在后面应用到新的pty上去。如果用&运行进程,Expect就没有机会去读终端参数了,因为在Expect接到控制的时候终端已经断开了。
 
exit [-opts] [status]
退出Expect或准备退出。
-onexit参数使下一个参数作为exit的句柄,如果没有参数,则返回当前exit句柄。
-noexit选项使expect准备退出,但在实际返回控制给OS后才退出。如同expect内部句柄一样,用户定义的退出句柄被运行,Expect命令不再执行。如果你正在运行其它的tcl扩展的话这就是有用的。当前翻译器(如果在tk环境中就是主窗口)保留以便其它的tcl扩展做清理。如果 expect的exit再次被调用,则句柄不被返回了。
在exit后,所有到spawn出来的进程的连接就关闭了。关闭会被spawn进程作为一个eof检测到。Exit做的事情不会超过普通的 _exit(2)过程的工作,因此,那些没有检查eof的spawn进程将继续运行。(必须确定条件的变化,比如,一个spawn进程将发什么信号,但这是系统决定的,可以参看exit(3)。)继续运行的spawn进程被init进程继承。
status(如果没有指定则是0)作为expect的exit状态被返回,运行到脚本的结尾时exit将会隐式地执行它。
exp_continue
此命令允许expect继续执行而不是象正常一样返回。(参看expect命令)
exp_internal [-f file] value
如果值为非零,允许更多命令发送诊断信息给Expect到stderr。为0则禁止此输出。诊断信息包括收到的每个字符,每次导致与协作方匹配当前输出的尝试。如果提供了可选的文件,所有正常的和debug的输出都会被写到这个文件里(不管它们的值)。任何先前的诊断输出文件被关闭。
-info参数使exp_internal返回最近给出的non-info参数的描述。
exp_open [args] [-i spawn_id]
返回一个和原始spawn id相关的tcl文件标识。这个文件标识就好象是由tcl的open命令打开一样。(spawn id不再使用了,wait也不会执行了)
-leaveopen参数保持spawn id为打开以供Expect命令使用。Wait命令必须在spawn id上执行。
exp_pid [-i spawn_id]
返回spawn进程的进程id。如果用了-i参数,返回的pid为相应的spawn 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的版本是兼容的。不带参数的话返回当然的expect版本。这个版本可能被编码进你的脚本。如果你确实知道你不是用的当前版本的特性,你应该指明一个早期的版本。
版本包含以点分隔的三个数。第一个是主版本。主版本不一致的脚本当然几乎不能工作,exp_version将返回一个错误。第二个是次版本。有更新的次版本的脚本如果用到了新特性将不能执行。exp_version返回一个错误。第三个几乎不起作用。。。(废话一堆)。
用了-exit参数,如果版本过时了Expect输出一个错误然后退出。

你可能感兴趣的:(职场,expect,休闲,leonkuo)