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