英语法语西班牙语

Ad


OnWorks 网站图标

期待 - 云端在线

通过 Ubuntu Online、Fedora Online、Windows 在线模拟器或 MAC OS 在线模拟器在 OnWorks 免费托管服务提供商中运行 expect

这是可以使用我们的多个免费在线工作站之一在 OnWorks 免费托管服务提供商中运行的命令,例如 Ubuntu Online、Fedora Online、Windows 在线模拟器或 MAC OS 在线模拟器

程序:

您的姓名


expect - 与交互式程序的编程对话,第 5 版

概要


期望 [ -dDinN [ -c 命令 ] [ [ -[f|b]] cmd文件 [ ARGS ]

引言


期望 是根据脚本与其他交互式程序“对话”的程序。
按照剧本, 期望 知道可以从程序中得到什么,以及
正确的回答应该是。 解释型语言提供分支和高级
控制结构来指导对话。 此外,用户可以控制和
需要时直接交互,然后将控制权返回给脚本。

期待 是...的混合物 期望Tk. 它的行为就像 期望Tk's 希望. 期望
也可以直接在C或C++中使用(即不用Tcl)。 看 期望(3)。

“Expect”这个名字来自于 发送/期待 由 uucp、kermit 推广的序列
和其他调制解调器控制程序。 然而与 uucp 不同的是, 期望 被概括为
可以作为用户级命令运行,并考虑到任何程序和任务。 期望 实际上可以
同时与多个程序交谈。

例如,这里有一些东西 期望 可以做:

· 让你的电脑给你回拨,让你不用付费就可以登录
电话。

· 开始游戏(例如,rogue),如果没有出现最佳配置,
重新启动它(一次又一次)直到它重新启动,然后将控制权交给您。

· 运行 fsck,并回答它的问题,回答“是”、“否”或给予控制权
根据预先确定的标准返回给您。

· 连接到另一个网络或 BBS(例如,MCI Mail、CompuServe)和
自动检索您的邮件,使其看起来就像原来一样
发送到您的本地系统。

· 携带环境变量、当前目录或任何类型的信息
通过 rlogin、telnet、tip、su、chgrp 等。

Shell 无法执行这些任务的原因有多种。 (试试,你会
见。)一切都可能与 期望.

一般情况下, 期望 可用于运行任何需要交互的程序
程序和用户。 所需要的只是交互可以是
以编程方式表征。 期望 还可以将控制权归还给用户(无需
停止正在控制的程序)如果需要。 同样,用户可以返回控制权
随时修改脚本。

用法


期望cmd文件 获取要执行的命令列表。 期望 也可以调用
在支持 #! 通过标记脚本可执行文件来表示,以及
在脚本中制作第一行:

#!/usr/bin/expect -f

当然,路径必须准确描述在哪里 期望 住。 / usr / bin 只是一个
例。

-c 标志作为要在脚本中的任何之前执行的命令的前言。 命令
应该被引用以防止被shell分解。 可以使用这个选项
多次。 一个命令可以执行多个命令 -c 通过将它们分开
带分号。 命令按照它们出现的顺序执行。 (使用 Expectk 时,
此选项指定为 -命令.)

-d 标志启用一些诊断输出,主要报告内部活动
命令如 期望相互作用. 此标志与“exp_internal 1”具有相同的效果
在一个 Expect 脚本的开头,加上 期望 被打印。 (这 痕迹
命令对于跟踪语句很有用,并且 追踪 命令对于跟踪很有用
变量赋值。)(使用 Expectk 时,此选项指定为 -诊断.)

-D 标志启用交互式调试器。 后面应该有一个整数值。 这
如果该值非零或
^C 被按下(或断点被击中,或其他适当的调试器命令出现在
剧本)。 请参阅 README 文件或另请参阅(下文)以获取有关
调试器。 (使用 Expectk 时,此选项指定为 -调试.)

-f 标志位于从中读取命令的文件的前面。 标志本身是可选的
因为它仅在使用 #! 符号(见上文),以便其他参数可以
在命令行上提供。 (使用 Expectk 时,此选项指定为 -文件.)

默认情况下,命令文件被读入内存并完整执行。 这是
有时希望一次读取一行文件。 例如,stdin 是这样读取的
道路。 为了强制以这种方式处理任意文件,请使用 -b 旗帜。 (什么时候
使用 Expectk,此选项指定为 -缓冲.)备注标准输出-
缓冲五月仍然采取地方Free Introduction 从先进先出或读取时不应该引起问题
标准输入。

如果字符串“-”作为文件名提供,则读取标准输入。 (用 ”。/-”
从实际命名为“-”的文件中读取。)

-i 标志原因 期望 以交互方式提示输入命令而不是阅读它们
从一个文件。 提示通过 出口 命令或EOF。 看 翻译员
(下)了解更多信息。 -i 如果既不是命令文件也不是 -c 用来。
(使用 Expectk 时,此选项指定为 -交互的.)

-- 可用于分隔选项的结尾。 如果你想通过一个
脚本的类似选项的参数,而不会被解释 期望。 这个可以
有用地放在#! 行以防止 Expect 的任何类似标志的解释。 为了
例如,以下将保留原始参数(包括脚本名称)
变量 精液.

#!/usr/bin/expect --

请注意,通常的 获取选择(3)和 执行(2) 添加时必须遵守约定
#! 的参数线。

文件 $exp_library/expect.rc 如果存在则自动获取,除非 -N 标志是
用过的。 (使用 Expectk 时,此选项指定为 -NORC.) 紧接着,
文件 〜/.expect.rc 是自动采购的,除非 -n 标志被使用。 如果
环境变量 DOTDIR 已定义,它被视为一个目录,而 .expect.rc 是
从那里阅读。 (使用 Expectk 时,此选项指定为 -诺克.) 这个采购
仅在执行任何操作后发生 -c 标志。

-v 导致 Expect 打印其版本号并退出。 (对应的标志在
使用长标志名称的 Expectk 是 -version。)

可选 ARGS 被构造成一个列表并存储在名为的变量中 精液. 氩气 is
初始化为 argv 的长度。

精氨酸0 定义为脚本的名称(如果未使用脚本,则为二进制名称)。 为了
例如,下面打印出脚本的名称和前三个参数:

send_user "$argv0 [lrange $argv 0 2]\n"

指令


期望 使用 TCL (工具命令语言)。 Tcl 提供控制流(例如,if、for、
break)、表达式求值和其他一些功能,例如递归、过程
定义等 此处使用但未定义的命令(例如, , if, EXEC) 是 Tcl
命令(见 TCL(3))。 期望 支持附加命令,如下所述。 除非
否则,命令返回空字符串。

命令按字母顺序列出,以便可以快速找到它们。 然而,新
用户可能会发现阅读说明更容易开始 , 提交, 期望
相互作用, 以该顺序。

请注意,该语言(Expect 和 Tcl)的最佳介绍在
书“探索期望”(另见下文)。 本手册页中包含示例,但
它们非常有限,因为本手册页主要用作参考资料。

请注意,在本手册页的文本中,带有大写“E”的“Expect”指的是
期望 程序,而带有小写“e”的“expect”指的是 期望 内命令
期望 程序。)

关闭 [-奴隶] [-oneexec 0|1] [-一世 产卵ID]
关闭与当前进程的连接。 大多数交互式程序会检测
EOF 在他们的标准输入上并退出; 因此 关闭 通常足以杀死进程
好。 的 -i 标志声明进程关闭对应于指定的
spawn_id。

以上皆是 期望相互作用 将检测当前进程何时退出并隐式
做一个 关闭. 但是如果你通过“exec kill $pid”来终止进程,你将需要
明确调用 关闭.

-oneexec 标志确定是否在任何新生成的生成中关闭生成 ID
过程或过程是否重叠。 要让 spawn id 保持打开状态,请使用值
0. 非零整数值将强制在任何新的生成中关闭(默认)
流程。

-奴隶 标志关闭与 spawn id 关联的 slave。 (参见“spawn -pty”。)
当连接关闭时,从站也会自动关闭,如果仍然
打开。

无论连接是隐式关闭还是显式关闭,您都应该调用
等待 清除相应的内核进程槽。 关闭 不叫 等待
因为不能保证关闭过程连接会导致它退出。
我们 等待 下面了解更多信息。

调试 [[-现在] 0|1]
控制 Tcl 调试器,允许您单步执行语句、设置断点、
等等

没有参数,如果调试器没有运行,则返回 1,否则返回 0
回。

参数为 1 时,调试器启动。 参数为 0 时,调试器是
停了下来。 如果 1 参数前面是 -现在 标志,调试器已启动
立即(即,在中间 调试 命令本身)。 否则,
调试器从下一个 Tcl 语句开始。

调试 命令不会更改任何陷阱。 将此与开始 Expect 进行比较
-D 标志(见上文)。

有关调试器的更多信息,请参见自述文件或另请参见(下文)。

断开
从终端断开分叉进程。 它继续在
背景。 进程有自己的进程组(如果可能)。 标准输入/输出
被重定向到 /dev/null。

以下片段使用 断开 继续运行脚本
背景。

如果 {[fork]!=0} 退出
断开
。 。 。

以下脚本读取密码,然后每小时运行一个程序
每次运行时都要求输入密码。 该脚本提供密码,以便
你只需要输入一次。 (见 姿势 演示如何转动的命令
关闭密码回显。)

send_user “密码?\”
expect_user -re "(.*)\n"
对于 {} 1 {} {
如果 {[fork]!=0} {sleep 3600;continue}
断开
生成 priv_prog
期待密码:
发送“$expect_out(1,string)\r”
。 。 。
出口
}

使用的好处 断开 通过 shell 异步进程功能 (&) 是
期望 可以在断开前保存终端参数,然后再断开
将它们应用到新的 pty。 和 &, 期望 没有机会阅读
终端的参数,因为此时终端已经断开连接 期望
接受控制。

出口 [-选择] [地位]
原因 期望 退出或以其他方式准备退出。

-退出 flag 导致下一个参数用作退出处理程序。 没有
参数,返回当前退出处理程序。

-没有出口 标志原因 期望 准备退出但实际上止步不前
将控制权交还给操作系统。 用户定义的退出处理程序运行为
以及 Expect 自己的内部处理程序。 没有进一步的 Expect 命令应该是
执行。 如果您使用其他 Tcl 扩展运行 Expect,这将很有用。 这
当前解释器(和主窗口,如果在 Tk 环境中)保持不变,以便其他
Tcl 扩展可以清理。 如果期望的 出口 再次被调用(但是这可能
发生),处理程序不会重新运行。

退出时,所有与衍生进程的连接都将关闭。 关闭将是
被生成的进程检测为 EOF。 出口 除了什么之外不采取其他行动
正常 _出口(2) 手续办。 因此,产生的进程不检查
EOF 可能会继续运行。 (各种条件对于确定很重要,因为
例如,什么信号将发送一个衍生的进程,但这些是系统-
依赖,通常记录在 出口(3).) 产生的进程继续
run 将被 init 继承。

状态 (如果未指定则为 0)作为退出状态返回 期望. 出口 is
如果到达脚本末尾,则隐式执行。

表达式_继续 [-继续计时器]
命令 表达式_继续 允许 期望 自己继续执行而不是
像往常一样返回。 默认情况下 表达式_继续 重置超时计时器。
-继续计时器 标志防止定时器被重新启动。 (看 期望 更多
信息。)

exp_内部 [-F 文件] 折扣值
导致进一步的命令向内部发送诊断信息 期望 到标准错误
if 折扣值 非零。 如果此输出被禁用 折扣值 是 0. 诊断
信息包括收到的每个字符,以及每次尝试匹配
针对模式的当前输出。

如果可选 文件 提供,所有正常和调试输出写入
文件(无论 折扣值)。 任何以前的诊断输出文件是
关闭。

-信息 标志导致 exp_internal 返回最近的非
给出的信息参数。

exp_open [参数] [-一世 产卵ID]
返回对应于原始 spawn id 的 Tcl 文件标识符。 文件
然后可以使用标识符,就好像它是由 Tcl 的打开一样 打开 命令。 (产卵
不应再使用 id。 一种 等待 不应该被执行。

-离开 标志使 spawn id 打开以通过 Expect 命令进行访问。 一种
等待 必须在 spawn id 上执行。

exp_pid [-一世 产卵ID]
返回与当前生成的进程对应的进程 ID。 如果 -i
使用标志,返回的 pid 对应于给定 spawn id 的 pid。

表达式发送
是的别名 提交.

exp_发送_错误
是的别名 发送错误.

exp_发送_日志
是的别名 发送日志.

exp_send_tty
是的别名 发送_tty.

exp_发送_用户
是的别名 发送用户.

exp_版本 [[-出口] 版本]
可用于确保脚本与当前版本兼容
预计。

没有参数,当前版本 期望 被退回。 然后这个版本可能
在你的脚本中编码。 如果您确实知道您没有使用
最新版本,您可以指定较早的版本。

版本由三个由点分隔的数字组成。 首先是主要号码。
为版本编写的脚本 期望 使用不同的主编号几乎
肯定不行。 exp_版本 如果主编号不匹配,则返回错误。

其次是次要号码。 为具有更大次要的版本编写的脚本
当前版本的数量可能取决于某些新功能,并且可能无法运行。
exp_版本 如果主编号匹配,但脚本次编号匹配,则返回错误
大于运行的 期望.

第三个数字在版本比较中没有作用。 然而,它是
期望 以任何方式更改软件分发,例如通过
附加文档或优化。 每个新的未成年人都会重置为 0
版。

随着 -出口 旗, 期望 如果版本已过期,则打印错误并退出。

期望 [[-选项] pat1 正文1] ... [-选择] 帕顿 [身体]
等待直到模式之一与衍生进程的输出匹配,指定的
时间段已过,或看到文件结尾。 如果最后的 body 是空的,它
可以省略。

最近的模式 期望之前 命令在任何之前隐式使用
其他图案。 最近的模式 期望之后 命令是隐式的
在任何其他模式之后使用。

如果整个论据 期望 语句需要多于一行,所有的
参数可以“支撑”成一个,以避免用
反斜杠。 在这种情况下,通常的 Tcl 替换将发生,尽管
大括号。

如果模式是关键字 EOF,相应的主体在结束时执行 -
文件。 如果模式是关键字 超时, 相应的主体被执行
暂停。 如果未使用 timeout 关键字,则执行隐式空操作
暂停。 默认超时时间为 10 秒,但可以设置为例如
30、通过命令“set timeout 30”。 无限超时可以由
值 -1。 如果模式是关键字 默认,执行相应的body
在超时或文件结束时。

如果模式匹配,则执行相应的主体。 期望 返回
正文的结果(如果没有模式匹配,则为空字符串)。 在这种情况下
多个模式匹配,第一个出现的用于选择一个主体。

每次新输出到达时,都会按照它们出现的顺序与每个模式进行比较
列出。 因此,您可以通过制作最后一个模式来测试是否存在匹配
保证会出现的东西,例如提示。 在没有的情况下
提示,您必须使用 超时 (就像您手动交互时所做的那样)。

模式以三种方式指定。 默认情况下,模式被指定为
Tcl的 绳子 匹配 命令。 (这种模式也类似于 C-shell 正则
表达式通常称为“glob”模式)。 这 -gl 可以使用标志
保护可能匹配的模式 期望 这样做的标志。 任何
应该以这种方式保护以“-”开头的模式。 (所有字符串开始
带有“-”的保留用于将来的选项。)

例如,以下片段查找成功登录。 (注意 中止
假定为脚本中其他地方定义的过程。)

预计 {
忙 {把忙\n ; exp_continue}
中止失败
“无效密码”中止
超时中止
已联繫
}

第四个模式需要引号,因为它包含一个空格,这将
否则将模式与动作分开。 具有相同动作的模式(例如
作为第 3 和第 4 项)需要再次列出操作。 这可以通过使用来避免
regexp 风格的模式(见下文)。 有关形成 glob 样式模式的更多信息
可以在 Tcl 手册中找到。

正则表达式样式的模式遵循 Tcl 定义的语法 正则表达式 (“常规”的缩写
表达式") 命令。正则表达式模式与标志一起引入 -回覆。 该
可以使用正则表达式将前面的示例重写为:

预计 {
忙 {把忙\n ; exp_continue}
-re “失败|无效密码”中止
超时中止
已联繫
}

两种类型的模式都是“非锚定的”。 这意味着模式不必
匹配整个字符串,但可以在字符串中的任何位置开始和结束匹配(如
只要其他一切都匹配)。 使用 ^ 匹配字符串的开头,并使用 $
匹配结束。 请注意,如果您不等待字符串的结尾,您的
响应很容易出现在字符串的中间,因为它们是从
产生的过程。 虽然仍然产生正确的结果,但输出看起来
不自然。 因此,如果您能准确描述字符,则鼓励使用 $
在字符串的末尾。

请注意,在许多编辑器中,^ 和 $ 匹配行的开头和结尾
分别。 但是,因为expect不是面向行的,所以这些字符匹配
当前预期中的数据(与行相对)的开头和结尾
匹配缓冲区。 (另外,请参阅下面关于“系统消化不良”的说明。)

-前任 flag 使模式匹配为“精确”字符串。 不
对 *、^ 等进行了解释(尽管通常的 Tcl 约定仍然必须
观察)。 确切的模式总是未锚定的。

-nocase flag 导致输出的大写字符进行比较,就好像它们
是小写字符。 图案不受影响。

读取输出时,超过 2000 个字节可以强制较早的字节
“忘记了”。 这可能会随着功能而改变 最大匹配。 (注意
过大的值会减慢模式匹配器的速度。)如果 名单 is
全缓冲, 相应的主体被执行,如果 最大匹配 字节已
收到并且没有其他模式匹配。 无论是 全缓冲 关键词
被使用,遗忘的字符被写入expect_out(buffer)。

If 名单 是关键字 , 并且允许空值(通过 删除空值
命令),如果匹配到单个 ASCII 0,则执行相应的主体。 这是
无法通过 glob 或 regexp 模式匹配 0 个字节。

匹配模式(或 eof 或 full_buffer)后,任何匹配的和以前的
不匹配的输出保存在变量中 期望输出(缓冲区). 最多 9 个正则表达式
子串匹配保存在变量中 期望输出(1,字符串) 通过
期望输出(9,字符串)。 如果 -指数 标志用在模式之前,开始
和结束索引(以适合的形式 兰奇) 的 10 个字符串存储在
变量 期望输出(X,开始)期望输出(X,结束) 其中 X 是一个数字,
对应于缓冲区中的子字符串位置。 0 指的是字符串
匹配整个模式并为全局模式以及正则表达式生成
模式。 例如,如果一个进程产生了“abcdefgh\n”的输出,结果
作者:

期待“CD”

就好像执行了以下语句:

设置expect_out(0,string) cd
设置 expect_out(buffer) abcd

并且 "efgh\n" 留在输出缓冲区中。 如果一个过程产生了输出
“abbbcabkkkkka\n”,结果:

期望 -indices -re "b(b*).*(k+)"

就好像执行了以下语句:

设置expect_out(0,start) 1
设置expect_out(0,end) 10
设置expect_out(0,string) bbbcabkkkk
设置expect_out(1,start) 2
设置expect_out(1,end) 3
设置expect_out(1,string) bb
设置expect_out(2,start) 10
设置expect_out(2,end) 10
设置expect_out(2,string) k
设置expect_out(buffer) abbbcabkkkk

并且 "a\n" 留在输出缓冲区中。 模式“*”(和 -re“.*”)将刷新
输出缓冲区,而无需从进程中读取更多输出。

通常,匹配的输出会从 Expect 的内部缓冲区中丢弃。 这可能
通过在模式前加上前缀来防止 -无转移 旗帜。 这个标志是
在实验中特别有用(为了方便可以缩写为“-not”
在实验中)。

存储与匹配输出(或 eof 或 full_buffer)关联的 spawn id
in 期望输出(spawn_id).

-暂停 flag 导致当前的 expect 命令使用以下值作为
timeout 而不是使用 timeout 变量的值。

默认情况下,模式与当前进程的输出匹配,但是
-i 标志声明来自命名 spawn_id 列表的输出与任何匹配
以下模式(直到下一个 -i)。 spawn_id 列表应该是一个
空格分隔的 spawn_id 列表或引用此类列表的变量
spawn_ids。

例如,以下示例等待来自当前进程的“已连接”,
或 $proc2 命名的 spawn_id 中的“忙”、“失败”或“密码无效”。

预计 {
-i $proc2 busy {把忙\n ; exp_continue}
-re “失败|无效密码”中止
超时中止
已联繫
}

全局变量的值 任何_spawn_id 可用于将模式匹配到任何
与所有其他名称一起命名的 spawn_id -i 当前的标志 期望 命令。 的
spawn_id 来自 -i 没有关联模式的标志(即,紧随其后的是
另一个 -i) 可用于相同的任何其他模式 期望 命令
any_spawn_id。

-i flag 也可以命名一个全局变量,在这种情况下,该变量被读取为
生成 ID 列表。 每当变量发生变化时,都会重新读取该变量。 这提供了一种方法
在命令执行时更改 I/O 源。 提供了生成 ID
这种方式称为“间接”生成 ID。

行动如 打破继续 原因控制结构(即 , 进程),以
以通常的方式行事。 命令 表达式_继续 允许 期望 自己继续
执行而不是像往常一样返回。

这对于避免显式循环或重复的期望语句很有用。 这
以下示例是自动 rlogin 的片段的一部分。 这 表达式_继续 避免
不得不写一秒钟 期望 语句(再次查找提示)如果
rlogin 提示输入密码。

预计 {
密码: {
stty-回声
send_user "$host 上的密码(用于 $user):"
expect_user -re "(.*)\n"
发送用户“\n”
发送“$expect_out(1,string)\r”
回声
表达式_继续
}不正确{
send_user "密码或帐户无效\n"
出口
} 暂停 {
send_user "与 $host 的连接超时\n"
出口
}eof{
发送用户\
“连接到主机失败:$expect_out(buffer)”
出口
} -re $提示
}

例如,以下片段可能有助于用户引导交互
已经完全自动化。 在这种情况下,终端被置于原始模式。 如果
用户按“+”,变量增加。 如果按下“p”,则返回多个
发送到进程,也许以某种方式戳它,“我”让用户交互
在这个过程中,有效地从脚本中窃取了控制权。 在每种情况下,
表达式_继续 允许电流 期望 之后继续模式匹配
执行当前动作。

stty 原始回声
期望之后{
-i $user_spawn_id
"p" {发送 "\r\r\r"; exp_continue}
"+" {incr foo; exp_continue}
“我”{互动; exp_continue}
“退出”退出
}

默认情况下, 表达式_继续 重置超时计时器。 定时器不会重新启动,如果
表达式_继续 被称为 -继续计时器 旗。

期望之后 [期望参数]
期望之前 除了如果来自两者的模式 期望
期望之后 可以匹配, 期望 模式被使用。 见 期望之前 命令
获取更多信息.

期望背景 [期望参数]
使用相同的参数 期望,但它会立即返回。 模式是
每当新输入到达时进行测试。 图案 超时默认 毫无意义
期望背景 并被默默地丢弃。 否则, 期望背景
命令使用 期望之前期望之后 图案就像 期望 一样。

什么时候 期望背景 正在评估操作,后台处理
相同的 spawn id 被阻止。 操作时后台处理被解锁
完成。 当后台处理被阻止时,可以做一个
(前景) 期望 在同一个生成 ID 上。

无法执行 期望 而一个 期望背景 已解锁。
期望背景 对于特定的 spawn id,通过声明一个新的
具有相同生成 ID 的 expect_background。 申报 期望背景 没有
模式从匹配模式的能力中删除给定的 spawn id
背景。

期望之前 [期望参数]
使用相同的参数 期望,但它会立即返回。 模式-动作
对最近的 期望之前 具有相同的 spawn id 被隐式添加
对任何以下 期望 命令。 如果模式匹配,则将其视为已匹配
已在 期望 命令本身,相关联的主体在
的上下文 期望 命令。 如果来自两者的模式 期望之前期望
可以匹配, 期望之前 模式被使用。

如果未指定任何模式,则不会检查 spawn id 中的任何模式。

除非被一个 -i 旗, 期望之前 模式与 spawn id 匹配
当时定义的 期望之前 命令被执行(不是当它的
模式匹配)。

-info 标志导致 期望之前 返回什么的当前规格
它将匹配的模式。 默认情况下,它报告当前的 spawn id。 一个
可以提供可选的 spawn id 规范以获取有关该 spawn id 的信息。 为了
例子

Expect_before -info -i $proc 之前

最多可以给出一个 spawn id 规范。 标志 -indirect 抑制
仅来自间接规范的直接生成 ID。

而不是 spawn id 规范,标志“-all”将导致“-info”报告
所有生成 ID。

-info 标志的输出可以重复用作 expect_before 的参数。

期待_tty [期望参数]
就像 期望 但它从 /dev/tty 读取字符(即来自
用户)。 默认情况下,读取是在熟模式下执行的。 因此,行必须以
退货 期望 去看他们。 这可以通过改变 姿势 (见
姿势 命令如下)。

期望用户 [期望参数]
就像 期望 但它从标准输入读取字符(即来自用户的按键)。
默认情况下,读取是在熟模式下执行的。 因此,行必须以回车结束
为了 期望 去看他们。 这可以通过改变 姿势 (见 姿势 命令
下文)。

创建一个新进程。 新进程是当前进程的精确副本 期望
过程。 成功时, 向新(子)进程返回 0 并返回
子进程到父进程的进程ID。 失败时(总是由于
缺乏资源,例如交换空间、内存), 将 -1 返回给父级
进程,并且没有创建子进程。

分叉的进程通过 出口 命令,就像原始过程一样。 分叉
允许进程写入日志文件。 如果您不禁用调试或
登录大多数进程,结果可能会令人困惑。

一些 pty 实现可能会被多个读者和作者混淆,即使
暂时。 因此,最安全的做法是 在生成进程之前。

相互作用 [字符串1 正文1] ... [字符串] [身体]]
将当前进程的控制权交给用户,以便将击键发送到
当前进程,返回当前进程的stdout和stderr。

字符串-主体对可以指定为参数,在这种情况下主体被执行
当输入相应的字符串时。 (默认情况下,字符串不会发送到
当前进程。) 翻译员 命令被假定,如果最终的身体是
失踪。

如果整个论据 相互作用 语句需要多于一行,所有
参数可以被“支撑”成一个,以避免以
反斜杠。 在这种情况下,通常的 Tcl 替换将发生,尽管
大括号。

例如,下面的命令运行与下面的 string-body 交互
对定义:当按下 ^Z 时, 期望 被暂停。 (这 -重启 标志恢复
终端模式。)当按下 ^A 时,用户会看到“你输入了一个控制-A”并且
该过程被发送一个 ^A。 当按下 $ 时,用户会看到日期。 当 ^C 是
压, 期望 退出。 如果输入“foo”,用户将看到“bar”。 当~~是
按下, 期望 解释器以交互方式运行。

设置CTRLZ \032
相互影响 {
-reset $CTRLZ {执行kill -STOP [pid]}
\001 {send_user "你输入了一个控件-A\n";
发送“\001”
}
$ {send_user "日期是[时钟格式[时钟秒]]。"}
\003 退出
foo {send_user "bar"}
~~
}

在字符串-正文对中,字符串按照它们作为参数列出的顺序进行匹配。
部分匹配的字符串不会发送到当前进程中
剩下的来了。 如果随后输入了字符,则无法再输入
可能是匹配的,只有字符串的一部分会被发送到进程
不可能开始另一场比赛。 因此,作为部分子串的字符串
匹配可以稍后匹配,如果试图匹配的原始字符串
最终失败。

默认情况下,字符串匹配是精确的,没有通配符。 (相比之下, 期望
命令默认使用 glob 样式的模式。) -前任 标志可用于保护
否则可能匹配的模式 相互作用 这样做的标志。 任何图案
以“-”开头的应该以这种方式进行保护。 (所有以“-”开头的字符串
保留以供将来选择。)

-回覆 标志强制将字符串解释为正则表达式样式的模式。 在这
case,匹配的子串存储在变量中 交互输出 类似于
方式 期望 将其输出存储在变量中 期望输出。 该 -指数 标志是
同样支持。

模式 EOF 引入在文件结束时执行的操作。 独立
EOF 模式也可能遵循 -输出 标志在这种情况下,如果 eof 匹配
在写入输出时检测到。 默认的 EOF 动作是“返回”,所以
相互作用 简单地返回任何 EOF。

模式 超时 引入超时(以秒为单位)和执行的操作
在给定时间内没有读取任何字符之后。 这 超时 模式适用于
最近指定的进程。 没有默认超时。 特别的
变量“超时”(由 期望 命令)对此超时没有影响。

例如,以下语句可用于自动注销尚未登录的用户
输入了一个小时但仍然经常收到系统消息的人:

交互-输入$user_spawn_id 超时3600 返回-输出\
$spawn_id

如果模式是关键字 , 并且允许空值(通过 删除空值
命令),如果匹配到单个 ASCII 0,则执行相应的主体。 这是
无法通过 glob 或 regexp 模式匹配 0 个字节。

以旗帜开头的模式 -我写的 导致变量 交互输出(spawn_id)
设置为与模式(或 eof)匹配的 spawn_id。

行动如 打破继续 原因控制结构(即 , 进程),以
以通常的方式行事。 然而 回报 导致交互返回到它的调用者,
内部返回 原因 相互作用 导致其调用者返回。 例如,如果
“proc foo”被称为 相互作用 然后执行操作 内部返回, 进程 FOO
会回来。 (这意味着如果 相互作用 电话 翻译员 交互式打字
回报 将导致交互继续,而 内部返回 会导致
交互以返回其调用者。)

相互作用, 使用原始模式,以便所有字符都可以传递给
当前进程。 如果当前进程没有捕捉到作业控制信号,它将
如果发送停止信号则停止(默认情况下为 ^Z)。 要重新启动它,请发送继续信号
(例如通过“kill -CONT ”)。如果你真的想发送一个 SIGSTOP 到这样的
进程(由 ^Z),请考虑先生成 csh,然后再运行您的程序。 在
另一方面,如果你想发送一个 SIGSTOP 到 期望 本身,首先调用解释器
(也许通过使用转义字符),然后按 ^Z。

字符串-主体对可以用作避免必须输入
以交互方式解释和执行命令。 使用之前的终端模式
正在执行字符串-主体对的主体时。

为了速度,动作默认以原始模式执行。 这 -重启 标志重置
终端到之前的模式 相互作用 被执行(总是,熟模式)。
请注意,切换模式时输入的字符可能会丢失(
某些系统上终端驱动程序的不幸功能)。 使用的唯一理由
-重启 是如果您的操作取决于在熟模式下运行。

-回声 标志将与以下模式匹配的字符发送回进程
在读取每个字符时生成它们。 当用户
需要查看来自部分类型模式的反馈。

如果正在回显模式但最终无法匹配,则发送字符
到生成的进程。 如果生成的进程然后回显它们,用户将看到
字符两次。 -回声 可能只适用于以下情况
用户不太可能不完成模式。 例如,以下摘录是
来自 rftp,递归 ftp 脚本,其中提示用户输入 ~g、~p 或
~l,递归地获取、放置或列出当前目录。 这些是那么遥远
从正常的 ftp 命令来看,用户不太可能输入 ~ 后跟
其他任何事情,除了错误,在这种情况下,他们可能会忽略
结果反正。

相互影响 {
-echo ~g {getcurdirectory 1}
-echo ~l {getcurdirectory 0}
-echo ~p {putcurdirectory}
}

-无缓冲 标志将与以下模式匹配的字符发送到
读取字符时的输出过程。

当您希望让程序回显模式时,这很有用。 例如,
以下内容可用于监视某人正在拨打的位置(Hayes 风格的
调制解调器)。 每次看到“atd”时,脚本都会记录该行的其余部分。

过程日志编号{} {
交互 -nobuffer -re "(.*)\r" 返回
puts $log "[时钟格式 [时钟秒]]: 拨打 $interact_out(1,string)"
}

交互 -nobuffer "atd" 日志号

相互作用, 以前的使用 登录用户 被忽略。 特别是, 相互作用
强制记录其输出(发送到标准输出),因为它被假定为
用户不希望盲目交互。

-o 标志导致任何后续的键体对应用于输出
当前进程。 这可能很有用,例如,在处理发送
telnet 会话期间不需要的字符。

默认情况下, 相互作用 期望用户写入标准输入并读取标准输出
期望 过程本身。 这 -u 标志(对于“用户”)使 相互作用 寻找用户作为
由其参数命名的进程(必须是生成的 id)。

这允许将两个不相关的进程连接在一起,而无需使用显式
环形。 为了帮助调试,Expect 诊断总是转到 stderr(或 stdout for
某些日志记录和调试信息)。 出于同样的原因, 翻译员
命令将从标准输入交互读取。

例如,以下片段创建一个登录过程。 然后它拨叫用户
(未显示),最后将两者连接在一起。 当然,任何过程都可能是
代替登录。 例如,shell 将允许用户在没有
提供帐户和密码。

生成登录
设置登录 $spawn_id
生成提示调制解调器
# 拨回用户
# 连接用户登录
交互 -u $login

要将输出发送到多个进程,请列出每个 spawn id 列表,并以 -输出
旗帜。 一组输出 spawn id 的输入可以由 spawn id 列表确定
以一个开头 -输入 旗帜。 (两个都 -输入-输出 可以采用相同形式的列表
作为 -i 在标记 期望 命令,除了 any_spawn_id 在
相互作用.) 以下所有标志和字符串(或模式)都适用于此输入,直到
出现另一个 -input 标志。 如果不 -输入 出现, -输出 暗示“-输入
$user_spawn_id -output”。(同样,对于没有 -输入.) 如果
一种 -输入 指定,它会覆盖 $user_spawn_id。 如果一秒钟 -输入 is
指定,它会覆盖 $spawn_id。 额外的 -输入 可以指定标志。

两个隐含的输入过程默认将其输出指定为
$spawn_id 和 $user_spawn_id(反向)。 如果一个 -输入 标志出现没有 -输出
标志,来自该进程的字符将被丢弃。

-i 当没有其他标志时,标志引入了对当前 spawn_id 的替换 -输入
or -输出 使用标志。 -i 标志意味着一个 -o 标志。

可以通过使用更改正在交互的进程
间接生成 ID。 (间接生成 id 在关于期望的部分中描述
命令。)可以使用 -i、-u、-input 或 -output 指定间接生成 ID
标志。

翻译员 [参数]
导致用户被交互提示 期望 和 Tcl 命令。 这
打印每个命令的结果。

行动如 打破继续 原因控制结构(即 , 进程),以
以通常的方式行事。 然而 回报 导致解释器返回到它的调用者,
内部返回 原因 翻译员 导致其调用者返回。 例如,
如果“proc foo”被调用 翻译员 然后执行操作 内部返回, 进程
FOO 会回来。 任何其他命令导致 翻译员 继续提示
新命令。

默认情况下,提示包含两个整数。 第一个整数描述深度
评估堆栈的数量(即 Tcl_Eval 被调用了多少次)。 第二
整数是 Tcl 历史标识符。 可以通过定义一个提示来设置
称为“prompt1”的过程,其返回值成为下一个提示。 如果一个
语句有开引号、括号、大括号或方括号,辅助提示(通过
默认“+>”)在换行时发出。 可以通过定义来设置辅助提示
一个叫做“prompt2”的过程。

翻译员, 熟模式被使用,即使它的调用者使用的是原始模式。

如果标准输入关闭, 翻译员 将返回,除非 -eof 使用标志,其中
如果调用后续参数。

日志文件 [参数] [[-一种] 文件]
如果提供了文件名, 日志文件 将记录会议记录
(从那时开始)在文件中。 日志文件 如果没有参数将停止录制
给出。 任何以前的日志文件都将关闭。

代替文件名,Tcl 文件标识符可以通过使用 -打开 or
-离开 旗帜。 这类似于 命令。 (看 有关更多信息。)

-a 标志强制记录被抑制的输出 登录用户 命令。

默认情况下, 日志文件 命令 附加 到旧文件而不是截断它们,
为了能够一次关闭和打开多次的方便
会议。 要截断文件,请使用 -不附加 旗。

-信息 标志导致 log_file 返回最近非信息的描述
给出的论据。

登录用户 -信息|0|1
默认情况下,发送/期望对话记录到标准输出(如果打开则记录日志文件)。
命令“log_user 0”禁用记录到标准输出并重新启用
“登录用户 1”。 记录到日志文件不变。

-信息 标志导致 log_user 返回最近非信息的描述
给出的论据。

最大匹配 [-d] [-一世 产卵ID] [尺寸]
定义内部使用的缓冲区的大小(以字节为单位) 期望. 没有 尺寸
参数,返回当前大小。

随着 -d 标志,设置默认大小。 (初始默认值为 2000。)
-i 标志,为命名的 spawn id 设置大小,否则为当前设置
的过程。

覆盖 [-# 产卵ID] [-# 产卵ID] [...] 程序 [参数]
执行 程序 ARGS 代替当前 期望 程序,终止。 一种
裸连字符参数强制命令名称前面有一个连字符,就好像它是一个
登录外壳。 除了命名为参数的那些 spawn_id 之外,所有 spawn_id 都已关闭。 这些
映射到命名的文件标识符。

Spawn_ids 映射到文件标识符以供新程序继承。 为了
例如,以下行运行国际象棋并允许它由当前控制
过程 - 比如说,一个国际象棋大师。

覆盖 -0 $spawn_id -1 $spawn_id -2 $spawn_id 国际象棋

这比“interact -u”更有效,但是,它牺牲了执行的能力
程序化交互 期望 过程不再受控制。

请注意,没有提供控制终端。 因此,如果您断开连接或重新映射
标准输入,执行作业控制(shell、登录等)的程序将无法运行
正常。

平价 [-d] [-一世 产卵ID] [值]
定义是应保留还是从 spawned 的输出中去除奇偶校验
过程。 如果 折扣值 为零,奇偶校验被剥离,否则不剥离。
没有 折扣值 参数,返回当前值。

随着 -d 标志,设置默认奇偶校验值。 (初始默认为 1,即
奇偶校验没有被剥离。)随着 -i 标志,为命名设置奇偶校验值
spawn id,否则为当前进程设置。

删除空值 [-d] [-一世 产卵ID] [值]
定义是否从衍生进程的输出中保留或删除空值
在模式匹配或存储在变量之前 期望输出 or 交互输出。 如果
折扣值 为 1,则删除空值。 如果 折扣值 为 0,则不删除空值。 没有 折扣值
参数,返回当前值。

随着 -d 标志,设置默认值。 (初始默认为 1,即 nulls
被删除。)随着 -i 标志,该值是为命名的 spawn id 设置的,否则
它是为当前进程设置的。

是否删除空值, 期望 将空字节记录到日志和
标准输出。

提交 [-标志] 绳子
发送 绳子 到当前进程。 例如,命令

发送“你好世界\r”

发送字符,你好世界到当前进程。
(Tcl 包括一个类似 printf 的命令(称为 格式) 可以任意构建
复杂的字符串。)

尽管具有行缓冲输入的程序不会立即发送字符
读取字符直到发送返回字符。 表示返回字符
“\r”。

-- 标志强制将下一个参数解释为字符串而不是
旗帜。 任何字符串都可以以“--”开头,无论它实际上看起来像
旗帜。 这提供了一种可靠的机制来指定变量字符串而不会被
被那些意外看起来像旗帜的人绊倒了。 (所有字符串以
“-”保留用于将来的选项。)

-i 标志声明将字符串发送到命名的 spawn_id。 如果 spawn_id
is 用户生成 ID,并且终端处于原始模式,字符串中的换行符是
转换为返回换行符序列,以便它们看起来好像终端在
熟模式。 这 -生的 标志禁用此转换。

-空值 标志发送空字符(0 字节)。 默认情况下,发送一个空值。 一个
整数可以跟随 -空值 指示要发送多少个空值。

-break flag 生成中断条件。 这只有在 spawn id 时才有意义
指的是通过“spawn -open”打开的 tty 设备。 如果你已经产生了这样的进程
作为提示,您应该使用提示的约定来生成中断。

-s 标志强制输出“缓慢”发送,从而避免了常见的情况
计算机超越了为永远不会的人设计的输入缓冲区
输出相同的缓冲区。 此输出由变量的值控制
“send_slow”采用两个元素列表。 第一个元素是一个整数
描述要以原子方式发送的字节数。 第二个元素是真实的
描述原子发送必须经过的秒数的数字
分开了。 例如,“set send_slow {10 .001}”会强制“send -s”发送
每发送 1 个字符之间有 10 毫秒的字符串。

-h flag 强制输出(有点)像人类实际打字一样发送。
人物之间出现了类似人类的延迟。 (该算法基于
Weibull 分布,经过修改以适合此特定应用程序。)
输出由变量“send_human”的值控制,该值取 XNUMX
元素列表。 前两个元素是字符的平均到达间隔时间
秒。 默认情况下使用第一个。 第二个用于词尾,以
模拟在此类转换中偶尔发生的微妙停顿。 第三
参数是可变性的度量,其中 1 是可变的,1 是合理的
变量,而 10 是相当不变的。 极值是 0 到无穷大。 最后两个
参数分别是最小和最大到达间隔时间。 最低
和最大值最后使用并“剪辑”最后一次。 最终平均值可以是
如果最小和最大剪辑足够,则与给定的平均值完全不同
值。

例如,以下命令模拟快速且一致的打字员:

设置 send_human {.1 .3 1 .05 2}
send -h “我饿了。我们一起吃午饭吧。”

而以下可能更适合宿醉后:

设置 send_human {.4 .4 .2 .5 100}
发送 -h “Goodd 派对狂欢之夜!”

请注意,不会模拟错误,但您可以设置错误纠正
通过在发送参数中嵌入错误和更正来调整自己的情况。

发送空字符、发送中断、强制慢速输出的标志
和人式输出是互斥的。 只有最后指定的一个将
使用。 此外,没有 绳子 参数可以用发送标志指定
空字符或中断。

在第一个之前是个好主意 提交 到一个过程 期望. 期望
等待进程开始,而 提交 不能。 特别地,如果第一个 提交
在进程开始运行之前完成,您将面临数据丢失的风险
忽略。 在交互式程序不提供初始提示的情况下,您可以
优于 提交 延迟如下:

# 为避免给黑客提示如何闯入,
# 本系统不提示输入外部密码。
# 等待 5 秒让 exec 完成
生成 telnet very.secure.gov
睡5
发送密码\r

表达式发送 是的别名 提交. 如果您使用的是 Expectk 或其他一些变体
在 Tk 环境中期待, 提交 由 Tk 定义,用于完全不同的
目的。 表达式发送 提供环境之间的兼容性。 相似的
别名是为其他 Expect 的其他发送命令提供的。

发送错误 [-标志] 绳子
就像 提交, 除了输出被发送到 stderr 而不是当前
的过程。

发送日志 [ - ] 绳子
就像 提交,除了字符串只发送到日志文件(见 日志文件.)
如果没有打开日志文件,这些参数将被忽略。

发送_tty [-标志] 绳子
就像 提交, 除了输出被发送到 /dev/tty 而不是当前
的过程。

发送用户 [-标志] 绳子
就像 提交, 除了输出被发送到 stdout 而不是当前
的过程。

睡觉
使脚本休眠给定的秒数。 秒可能是一个
十进制数。 中断(和 Tk 事件,如果你使用的是 Expectk)被处理
而 Expect 睡觉。

[参数] 程序 [参数]
创建一个正在运行的新进程 程序 ARGS. 它的标准输入、标准输出和标准错误是
连接到 Expect,以便它们可以被其他人读取和写入 期望 命令。
连接被中断 关闭 或者如果进程本身关闭了任何文件
身份标识。

当一个进程被启动时 ,变量 生成 ID 设置为描述符
指那个过程。 描述的过程 生成 ID 被认为是
当前 过程. 生成 ID 可以被读取或写入,实际上提供了作业控制。

用户生成 ID 是一个全局变量,包含引用用户的描述符。
例如,什么时候 生成 ID 设置为这个值, 期望 表现得像 期望用户.

错误生成 ID 是一个包含描述符的全局变量,该描述符引用
标准错误。 例如,当 生成 ID 设置为这个值, 提交 表现得像
发送错误.

tty_spawn_id 是一个全局变量,包含一个指向 /dev/tty 的描述符。
如果 /dev/tty 不存在(例如在 cron、at 或批处理脚本中),则
tty_spawn_id 没有定义。 这可以测试为:

如果 {[信息变量 tty_spawn_id]} {
# /dev/tty 存在
} {
# /dev/tty 不存在
# 可能在 cron、batch 或 at 脚本中
}

返回 UNIX 进程 ID。 如果没有产生进程,则返回 0。 这
变量 spawn_out(奴隶,名字) 设置为 pty 从设备的名称。

默认情况下, 回显命令名称和参数。 这 -诺回声 旗帜停止
从这样做。

-安慰 标志导致控制台输出被重定向到生成的进程。
并非所有系统都支持此功能。

在内部, 使用 pty,以与用户的 tty 相同的方式初始化。 这是
进一步初始化,以便所有设置都是“理智的”(根据 姿势(1))。 如果
变量 stty_init 被定义,它以 stty 参数的风格解释为
进一步配置。 例如,“set stty_init raw”会导致进一步产生
进程的终端以原始模式启动。 -nottycopy 跳过初始化
基于用户的 tty。 -nottyinit 跳过“理智”初始化。

通常情况下, 执行所需的时间很少。 如果您注意到 spawn 需要
在相当长的时间内,它可能会遇到被楔入的 pty。 一种
在 ptys 上运行的测试数量以避免与错误进程纠缠。
(每个楔形 pty 需要 10 秒。)使用 -d 选项将显示
if 期望 在奇怪的状态下遇到许多 pty。 如果你不能杀死进程
这些 pty 所附加的,您唯一的办法可能是重新启动。

If 程序 无法成功生成,因为 EXEC(2) 失败(例如,当 程序
不存在),下一个会返回错误信息 相互作用 or 期望
命令好像 程序 已运行并产生错误消息作为输出。 这个
行为是实施的自然结果 . 在内部,产卵
分叉,之后产生的进程无法与原始进程通信
期望 除通过 spawn_id 进行通信外的进程。

-打开 flag 导致下一个参数被解释为 Tcl 文件标识符
(即,返回 打开.) 然后可以使用 spawn id 就好像它是 spawned
过程。 (不应再使用文件标识符。)这使您可以处理原始
设备、文件和管道作为衍生进程而不使用 pty。 0 是
返回表示没有关联的进程。 当连接到
生成的进程已关闭,Tcl 文件标识符也已关闭。 这 -离开 标志是
-打开 除了那个 -离开 导致文件标识符保持打开状态
即使在 spawn id 关闭之后。

-pty 标志导致打开 pty 但不产生进程。 0 返回到
表示没有关联的进程。 Spawn_id 照常设置。

变量 spawn_out(奴隶,FD) 被设置为对应于的文件标识符
pty 奴隶。 它可以使用“close -slave”关闭。

-忽略 flag 命名要在生成的进程中忽略的信号。 除此以外,
信号获得默认行为。 信号被命名为 陷阱 命令,除了
每个信号都需要一个单独的标志。

痕迹 水平
导致在执行之前打印以下语句。 (Tcl的踪迹
命令跟踪变量。) 水平 指示要跟踪的调用堆栈向下多远。
例如,运行以下命令 期望 在追踪前 4 个级别时
调用,但没有低于此值。

期望 -c "strace 4" script.exp

-信息 flag 导致 strace 返回最近非信息的描述
给出的论据。

姿势 ARGS
类似于外部 stty 命令更改终端模式。

默认情况下,访问控制终端。 可以访问其他终端
通过将“< /dev/tty...”附加到命令中。 (注意,参数不应该是
分组为一个参数。)

状态请求将其作为命令的结果返回。 如果没有状态
请求并访问控制终端,原始数据的先前状态
和 echo 属性以稍后可由命令使用的形式返回。

例如,参数 or 煮熟的 将终端置于原始模式。 这
参数 -生的 or 将终端置于煮熟模式。 论据 回音
-回声 将终端分别置于 echo 和 noecho 模式。

以下示例说明了如何暂时禁用回显。 这可能是
在其他自动脚本中使用,以避免在其中嵌入密码。 (查看更多
在下面的预期提示下对此进行讨论。)

stty-回声
send_user "密码:"
expect_user -re "(.*)\n"
设置密码 $expect_out(1,string)
回声

系统 ARGS
ARGSsh(1) 作为输入,就好像它是从一个命令中输入的一样
终奌站。 期望 等待直到 shell 终止。 sh 的返回状态是
处理方式相同 EXEC 处理其返回状态。

与之相反 EXEC 它将 stdin 和 stdout 重定向到脚本, 系统 施行
没有重定向(字符串本身指示的除外)。 因此,它是
可以使用必须直接与 /dev/tty 对话的程序。 出于同样的原因,
结果 系统 不记录在日志中。

时间戳 [参数]
返回一个时间戳。 没有参数,自纪元以来的秒数是
回。

-格式 flag 引入了一个返回的字符串,但进行了替换
根据 strftime 的 POSIX 规则。 例如 %a 被替换为
缩写的工作日名称(即周六)。 其他有:
%a 缩写的工作日名称
%一个完整的工作日名称
%b 缩写的月份名称
%B 完整的月份名称
%c 日期时间:6 年 11 月 45 日星期三 56:1993:XNUMX
每月的第 %d 天 (01-31)
%H 小时 (00-23)
%I 小时 (01-12)
%j 天 (001-366)
%m 月 (01-12)
%M 分钟 (00-59)
%p 上午或下午
%S 秒 (00-61)
%u 天(1-7,星期一是一周的第一天)
%U 周(00-53,第一个星期日是第一周的第一天)
%V 周(01-53,ISO 8601 样式)
%w 天 (0-6)
%W 周(00-53,第一个星期一是第一周的第一天)
%x 日期时间:6 年 1993 月 XNUMX 日星期三
%X 时间为:23:59:59
%y 年 (00-99)
%Y 年份为:1993
%Z 时区(如果无法确定,则什么都没有)
%% 一个空百分号

其他 % 规格未定义。 其他字符将通过
原封不动。 仅支持 C 语言环境。

-秒 标志引入了自纪元以来的秒数,用作
要格式化的来源。 否则,使用当前时间。

-格林威治标准时间 标志强制时间戳输出使用 GMT 时区。 没有国旗,
使用本地时区。

陷阱 [[命令] 信号]
导致给定的 命令 在未来收到任何给定的
信号。 该命令在全局范围内执行。 如果 命令 缺席,
返回信号动作。 如果 命令 是字符串 SIG_IGN,信号是
忽略。 如果 命令 是字符串 SIG_DFL,信号是系统的结果
默认。 信号 是单个信号或信号列表。 信号可能是
根据数字或符号指定 信号(3). “SIG”前缀可能是
省略。

没有参数(或参数 -number), 陷阱 返回信号编号
当前正在执行的陷阱命令。

-码 标志使用命令的返回码代替 Tcl 的任何代码
将在命令最初开始运行时返回。

-interp 标志导致使用激活的解释器评估命令
命令开始运行的时间,而不是声明陷阱的时间。

-芋头 标志导致 陷阱 命令返回陷阱命令的信号名称
目前正在执行。

-最大限度 标志导致 陷阱 命令返回最大的信号数
被设置。

例如,命令“trap {send_user "Ouch!"} SIGINT”将打印“Ouch!” 每个
用户按下 ^C 的时间。

默认情况下,SIGINT(通常可以通过按 ^C 生成)和 SIGTERM 导致
期待退出。 这是由于下面的trap,Expect时默认创建的
开始。

陷阱退出 {SIGINT SIGTERM}

如果使用 -D 标志来启动调试器,则 SIGINT 被重新定义以启动调试器
交互式调试器。 这是由于以下陷阱:

陷阱 {exp_debug 1} SIGINT

调试器陷阱可以通过设置环境变量来改变
EXPECT_DEBUG_INIT 到一个新的陷阱命令。

当然,您可以通过将陷阱命令添加到您的
脚本。 特别是,如果您有自己的“trap exit SIGINT”,这将覆盖
调试器陷阱。 如果您想阻止用户访问
调试器。

如果你想在 SIGINT 上定义你自己的陷阱,但在它出现时仍然陷阱到调试器
正在运行,使用:

如果 {![exp_debug]} {trap mystuff SIGINT}

或者,您可以使用其他信号捕获调试器。

陷阱 不会让您覆盖 SIGALRM 的操作,因为它在内部用于
期望. disconnect 命令将 SIGALRM 设置为 SIG_IGN(忽略)。 您可以重新启用
只要您在后续的 spawn 命令中禁用它。

我们 信号(3) 了解更多信息。

等待 [参数]
延迟直到产生的进程(或当前进程,如果没有命名)终止。

等待 通常返回一个包含四个整数的列表。 第一个整数是
等待的过程。 第二个整数是对应的 spawn id。
如果发生操作系统错误,则第三个整数为 -1,否则为 0。 如果
第三个整数是 0,第四个整数是 spawned 返回的状态
过程。 如果第三个整数是-1,则第四个整数是errno set的值
由操作系统。 还设置了全局变量 errorCode。

附加元素可能出现在返回值的末尾 等待。 一个
可选的第五个元素标识一类信息。 目前,唯一
此元素的可能值是 CHILDKILLED 在这种情况下接下来的两个值是
C 风格的信号名称和简短的文字描述。

-i 标志声明与命名的 spawn_id 相对应的等待进程(不是
进程 ID)。 在 SIGCHLD 处理程序中,可以等待任何产生的
使用 spawn id -1 进行处理。

-等待 标志使等待立即返回并指示
成功等待。 当进程退出时(稍后),它会自动消失
无需显式等待。

等待 命令也可以用于等待使用参数“-i”的分叉进程
-1"。与它与衍生进程的使用不同,此命令可以在任何时间执行
时间。 无法控制收获的过程。 但是,返回值
可以检查进程ID。

图书馆


Expect 自动知道有两个用于 Expect 脚本的内置库。 这些是
由变量 exp_library 和 exp_exec_library 中命名的目录定义。 两个都
旨在包含可由其他脚本使用的实用程序文件。

exp_library 包含与体系结构无关的文件。 exp_exec_library 包含
依赖于体系结构的文件。 根据您的系统,这两个目录可能完全是
空的。 $exp_exec_library/cat-buffers 文件的存在描述了你的
/斌/猫 默认情况下缓冲区。

漂亮的印刷品


vgrind 定义可用于漂亮打印 期望 脚本。 假设 vgrind
随附的定义 期望 发行版已正确安装,您可以使用它
如:

vgrind -lexect 文件

示例


很多人不清楚如何将手册页描述的所有内容放在一起。 一世
鼓励您阅读并尝试示例目录中的示例 期望
分配。 其中一些是真正的程序。 其他只是说明某些
技术,当然,有一些只是快速的技巧。 INSTALL 文件有一个快速
这些程序的概述。

期望 论文(参见另见)也很有用。 虽然有些论文使用语法
对应于早期版本的 Expect,随附的基本原理仍然有效
并比这个手册页更详细。

洞穴


扩展可能会与 Expect 的命令名称发生冲突。 例如, 提交 由 Tk 定义
为了一个完全不同的目的。 为此,大多数 期望 命令也是
可用作“exp_XXXX”。 以“exp”、“inter”、“spawn”开头的命令和变量,
和“超时”没有别名。 如果需要,请使用扩展命令名称
环境之间的兼容性。

期望 对范围界定持相当自由的观点。 特别是命令读取的变量
特定于 期望 程序将首先从本地范围内寻求,如果没有
发现,在全球范围内。 例如,这消除了放置“全局超时”的需要
在您编写的每个程序中使用 期望. 另一方面,写入的变量是
始终在本地范围内(除非已发出“全局”命令)。 最普遍的
这导致的问题是在程序中执行 spawn 时。 在程序之外,
生成 ID 不再存在,因此生成的进程不再可访问,因为
的范围。 向这样的过程添加“全局 spawn_id”。

如果您无法启用多重生成功能(即您的系统既不支持
选择(BSD *.*),轮询(SVR>2),也不是等价的), 期望 将只能
一次控制一个进程。 在这种情况下,不要尝试设置 生成 ID也没有
您是否应该在生成的进程运行时通过 exec 执行进程。 此外,
你将无法 期望 来自多个进程(包括用户作为一个)在
同时。

终端参数对脚本有很大的影响。 例如,如果编写一个脚本
寻找回声,如果关闭回声,它就会行为不端。 为此,期待
默认情况下强制执行健全的终端参数。 不幸的是,这可能会使事情
对其他程序不愉快。 例如,emacs shell 想要改变“通常的”
映射:换行符映射到换行符而不是回车换行符,并回显
被禁用。 这允许人们使用 emacs 来编辑输入行。 不幸的是,期待
不可能猜到这一点。

您可以要求 Expect 不覆盖其终端参数的默认设置,但是
在为此类环境编写脚本时,您必须非常小心。 如果是
emacs,避免依赖诸如回显和行尾映射之类的东西。

接受参数的命令包含在一个列表中( 期望 变体和
相互作用) 使用启发式方法来确定列表实际上是一个参数还是多个参数。 这
只有在列表确实代表单个的情况下,启发式方法才会失败
有多个嵌入的 \n 的参数,它们之间有非空白字符。
这似乎不太可能,但是参数“-nobrace”可用于强制执行
单个参数作为单个参数处理。 可以想象这可以与
机器生成的 Expect 代码。 同样,-brace 强制将单个参数作为
多种模式/动作。

使用 expect online 使用 onworks.net 服务


免费服务器和工作站

下载 Windows 和 Linux 应用程序

Linux 命令

Ad