【发布时间】:2010-10-07 22:42:38
【问题描述】:
我正在学习编写 TCL(预期)脚本,我注意到一些示例显示使用 spawn,而其他示例显示命令 exec。我尝试了谷歌搜索,但找不到有什么区别?
假设我在一个很长的期望脚本中间调用“exec”,我会发生什么?
【问题讨论】:
标签: scripting exec tcl expect spawn
我正在学习编写 TCL(预期)脚本,我注意到一些示例显示使用 spawn,而其他示例显示命令 exec。我尝试了谷歌搜索,但找不到有什么区别?
假设我在一个很长的期望脚本中间调用“exec”,我会发生什么?
【问题讨论】:
标签: scripting exec tcl expect spawn
据我所知,spawn 返回一个进程 ID(并与 Expect 链接),而 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 所做的复杂环境设置。它可以非常方便地与需要输入但仍然可以很好地设置自动化的程序进行交互。
【讨论】: