我正在学习编写 TCL(预期)脚本,我注意到一些示例显示使用 spawn,而其他示例显示命令 exec。我尝试谷歌搜索,但找不到有什么区别?
假设我在一个很长的期望脚本中间调用 'exec',我会发生什么?
spawn
是expect
命令不是tcl
命令。exec
是一个tcl
命令。
spawn
创建一个过程。进程的输入和输出连接到 expect 以供其他 expect 命令使用send
:expect
和interact
.
exec
在 tcl 下创建一个子进程。通常,tcl 会暂停,直到子进程完成。但是,可以在后台创建子进程(使用 & 作为最后一个参数),如果正确连接输入和输出,tcl 可以与子进程交互。这是非常笨拙的,并且正是期望旨在顺利处理的那种交互。
回答这个问题的一个更简单的方法是改写它以询问何时应该使用 exec 与 spawn。简而言之,将 spawn 用于交互式命令,将 exec 用于非交互式命令。
还值得注意的是,一些(很多?)程序在由用户(即在命令行)运行时与作为批处理过程的一部分/从另一个进程运行时表现不同。实际的区别在于进程是否附加了终端。
spawn 命令是 Tcl 的 Expect 扩展的一部分,它进行设置,使执行的程序将自己视为由用户运行,然后添加功能以允许 tcl 程序以方便的方式与外部程序交互(即匹配它通过正则表达式输出并分支这些匹配项)。通过 spawn 运行的东西是异步运行的。
exec 命令是运行其他程序并返回其输出的核心 Tcl 命令。它不会像 spawn 那样做任何复杂的设置,但是对于运行一个程序并查看它的输出(以及它的返回码)来说非常方便。默认情况下,由 exec 运行的东西是同步运行的,但是命令末尾的 & 号会导致它在后台运行(很像传统的 shell 脚本)。
open 命令虽然通常用于读/写文件,但也可用于运行外部进程。通过在命令名称前加上管道 (|) 符号,您可以告诉它运行外部进程,并获得对读/写文件描述符的访问权限以与生成的进程进行交互。这是 exec 和 spawn 之间的一种中间立场,与可用的进程有更多的交互,但没有 spawn 所做的复杂环境设置。它可以非常方便地与需要输入但仍然可以很好地设置自动化的程序进行交互。
据我所知,spawn 返回一个进程 ID(并与 Expect 链接),而 exec 只返回最终的标准输出,除非你通过“&”。所以它不会影响你的期望。