spawn和exec有什么区别?

22

我正在学习编写TCL(expect)脚本,发现一些示例使用spawn命令,而另一些示例则使用exec命令。我尝试了谷歌搜索,但找不到它们的区别在哪里?

假设我在一个较长的expect脚本中间调用'exec'命令,我可以期望会发生什么?

4个回答

18

spawn是一个expect命令,而不是tcl命令。 exec 是一个tcl命令。

spawn创建一个进程,该进程的输入和输出连接到expect,以供其他expect命令使用:如sendexpectinteract

exec在tcl下创建子进程。通常情况下,tcl会一直挂起,直到子进程完成。然而,如果把最后一个参数设为"&",则可以在后台创建子进程,并且如果正确连接输入和输出,tcl可以与子进程交互。这非常麻烦,正是expect旨在处理的平稳交互类型。


18

回答这个问题的更简单的方式是改变一下提问方式,询问何时应该使用exec和spawn。 简而言之,对于交互式命令,请使用spawn;对于非交互式命令,请使用exec。


5
值得注意的是,一些(许多?)程序在用户运行时(即在命令行中)和作为批处理过程/从另一个进程运行时会有不同的行为。实际上的区别在于进程是否连接了终端。
spawn命令是Tcl的Expect扩展的一部分,它设置了执行的程序看到自己是由用户运行的,并添加了功能,以便tcl程序以方便的方式与外部程序交互(即通过正则表达式匹配其输出并分支出这些匹配)。通过spawn运行的东西是异步运行的。
exec命令是一个核心的Tcl命令,可以运行其他程序并返回其输出。它不执行spawn所做的任何复杂设置,但对于仅运行程序并查看其输出(及其返回代码)非常方便。默认情况下,通过exec运行的东西是同步运行的,但在命令末尾加上&符号可以将其在后台运行(就像传统的shell脚本一样)。
open命令通常用于读写文件,但也可用于运行外部进程。通过在命令名称前加上管道(|)符号,您告诉它运行外部进程,并获取读/写文件描述符以与生成的进程交互。这是exec和spawn之间的一种中间地带,具有更多与进程交互的功能,但没有spawn所做的复杂环境设置。对于需要输入但仍相当适合自动化的程序进行交互非常方便。

这样一个程序的例子具有讽刺意味,它就是tclsh。 - Johannes Kuhn

0
据我所知,spawn返回一个进程ID(并与Expect链接),而exec仅返回最终的标准输出,除非您传递"&"。因此,它不会影响您的期望。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接