【问题标题】:How to write a program that wraps both STDOUT and STDIN of another program? [closed]如何编写一个包含另一个程序的 STDOUT 和 STDIN 的程序? [关闭]
【发布时间】:2017-02-09 13:35:00
【问题描述】:

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

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

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

【问题讨论】:

  • 请阅读“How to Ask”。你要求我们解释如何做一些你应该研究的事情,然后尝试编写代码,然后问一个特定的问题。 "How much research effort is expected of Stack Overflow users?" 相反,您要求我们提供教程。 Ruby 有多种方法可以做你想做的事。 Open3 类的文档将有助于解释,互联网上的各个页面也将有助于解释。
  • @theTinMan 非常感谢您的评论。到目前为止,我还没有找到任何关于如何将一个程序双向连接到另一个程序的信息。我也不知道可以用什么行话来恰当地描述这种情况。这就是我问这个问题的原因。当然,“需要多少研究”是非常主观的事情,所以我完全理解你投反对票的原因。无论如何,您到 Open3 模块的链接已经很有帮助。谢谢。
  • 不要误会,不过这个问题太含糊了。对于 REPL 工具,您可能需要查看 the readline module 以及非常适合包装子流程的 Open3。为了避免这里的摩擦,请记住 Stack Overflow 原则:展示您尝试过的内容,尤其是如果是代码。

标签: ruby unix stdout stdin pipeline


【解决方案1】:

使用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 也是如此,一旦我们完成了调用关闭的子进程。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-19
    • 1970-01-01
    • 2013-12-26
    • 2013-07-25
    • 1970-01-01
    • 1970-01-01
    • 2011-07-24
    相关资源
    最近更新 更多