与不同进程中正在运行的交互式控制台程序进行交互

与不同进程中正在运行的交互式控制台程序进行交互

我有一个带有交互式 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

的输出pythonis3并出现在标准输出上。如果我们重定向了 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,它将通过记录会话来帮助生成您的期望脚本。如果您稍微使用一下它并检查它的输出,您将更好地了解它是如何工作的。

相关内容