如何编写一个包装另一个程序的STDOUT和STDIN的程序?

时间:2016-09-30 21:51:47

标签: ruby unix stdout stdin pipeline

我想在Ruby中编写一个简单的自动化工具,它应该包装一个命令行程序。

命令行程序的工作方式有点像REPL:命令可以通过STDIN输入,输出返回到STDOUT。因此,Ruby工具需要能够从程序的STDOUT读取输入,并将新命令返回到程序STDIN。

如何设置这样的循环输入/输出? 我不完全确定这个问题是否与Ruby有关,或者它是否更多地涉及到如何在Unix系统中连接流。

1 个答案:

答案 0 :(得分:2)

使用IO.popen

实现起来非常简单
handler = IO.popen("bash","w+")

handler.puts("whoami")
puts handler.gets

handler.puts("date")
puts handler.gets

handler.close

输出:

wrodevlopot:tmp lopot$ ruby test.rb 
lopot
Sat Oct  1 21:57:42 CEST 2016

IO.popen返回一个IO处理程序,请注意我们用w+打开子进程,这意味着读写。在上面的示例中,我们打开一个发送命令whoami的bash进程,然后我们从中读取并打印,同样用于命令date,一旦我们完成了我们调用close的子进程。