我有一个带有交互式 shell 的控制台程序,类似于 Python 交互式 shell。有没有一种简单的方法来启动这个交互式程序A,然后使用另一个程序B来运行A?我想做这样的事情:
$ /usr/bin/A&
$ #find PID of A somehow
$ somecommand "PID of A" "input string to send to A"
output string from A
$
什么样的“某个命令”可以做到这一点?这就是“期望”应该促进的吗?我阅读了expect
手册页,但仍然不知道它的作用。
答案1
expect
是为了不同的目的。它在俘虏程序上运行命令。相比之下,您需要一种将命令发送到已在后台运行的进程的方法。
作为一个裸露的骨头您想要的最小示例,让我们创建一个 FIFO:
$ mkfifo in
FIFO 是一种特殊文件,一个进程可以向其中写入数据,而另一个进程可以从中读取数据。让我们创建一个从 FIFO 文件读取的进程in
:
$ python <in &
[1] 3264
现在,让我们发送python
一个命令以从当前 shell 运行:
$ echo "print 1+2" >in
$ 3
的输出python
is3
并出现在标准输出上。如果我们重定向了 python 的标准输出,它可以被发送到其他地方。
什么expect
是
expect
允许您自动与强制命令进行交互。作为可以执行的操作的示例expect
,创建一个文件:
#!/usr/bin/expect --
spawn python
expect ">>>"
send "print 1+2\r"
expect ">>>"
然后,使用以下命令运行该文件expect
:
$ expect myfile
spawn python
Python 2.7.3 (default, Mar 13 2014, 11:03:55)
[GCC 4.7.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> print 1+2
3
>>>
答案2
是的,这就是您可以使用expect 做的事情,其中您的expect 脚本是您的程序B。基本上,它需要一些字符串(可能是命令提示符),然后发送响应。
查看 autoexpect,它将通过记录会话来帮助生成您的期望脚本。如果您稍微使用一下它并检查它的输出,您将更好地了解它是如何工作的。