Scripting spawn和exec之间有什么区别?

Scripting spawn和exec之间有什么区别?,scripting,exec,tcl,expect,spawn,Scripting,Exec,Tcl,Expect,Spawn,我正在学习编写TCL(expect)脚本,我注意到一些示例显示了如何使用spawn,而另一些示例显示了exec命令。我试着用谷歌搜索,但找不到有什么区别 假设我在一个长的expect脚本中间调用'exec',我能期望发生什么呢?据我所知,spawn返回一个进程ID(并链接到expect),而exec只返回最后一个stdout,除非传递“&”。因此它不会影响您的期望。spawn是一个expect命令,而不是tcl命令exec是一个tcl命令 spawn创建一个进程。进程的输入和输出连接到expec

我正在学习编写TCL(expect)脚本,我注意到一些示例显示了如何使用spawn,而另一些示例显示了exec命令。我试着用谷歌搜索,但找不到有什么区别


假设我在一个长的expect脚本中间调用'exec',我能期望发生什么呢?

据我所知,spawn返回一个进程ID(并链接到expect),而exec只返回最后一个stdout,除非传递“&”。因此它不会影响您的期望。

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

spawn
创建一个进程。进程的输入和输出连接到expect以供其他expect命令使用:
send
expect
interact


exec
在tcl下创建一个子流程。通常,tcl将挂起,直到子流程完成。但是,可以在后台创建子流程(使用&作为最后一个参数),如果正确连接输入和输出,tcl可以与子流程交互。这非常笨拙,而且正是expect设计用来顺利处理的那种交互。

回答这个问题的一个更简单的方法是重新措辞,询问何时应该使用exec vs spawn。简而言之,对于交互式命令使用spawn,对于非交互式命令使用exec。

同样值得注意的是,当由用户运行(即,在命令行)与作为批处理过程的一部分/从另一个过程运行时,某些(许多?)程序的行为不同。实际的区别在于是否有一个终端连接到进程

spawn命令是对Tcl的Expect扩展的一部分,它进行设置,使已执行的程序将自己视为由用户运行,然后添加功能以允许Tcl程序以方便的方式与外部程序交互(即,通过正则表达式匹配其输出并分支这些匹配)。通过spawn运行的东西是异步运行的

exec命令是运行另一个程序并返回其输出的核心Tcl命令。它不做spawn所做的任何复杂设置,但对于运行程序并查看其输出(以及返回代码)来说非常方便。默认情况下,exec运行的东西是同步运行的,但是命令末尾的一个符号会导致它在后台运行(很像传统的shell脚本)


open命令虽然通常用于读取/写入文件,但也可用于运行外部进程。通过在命令名前面加上管道(|)符号,可以告诉它运行一个外部进程,并获得对读/写文件描述符的访问权,以便与结果进程交互。这是exec和spawn之间的一个中间地带,可以与流程进行更多的交互,但没有spawn那样复杂的环境设置。它可以非常方便地与需要输入的程序进行交互,但仍然可以很好地进行自动化设置。

具有讽刺意味的是,Tlsh就是这样一个程序的例子。