【问题标题】:How to control a subprocess stdin, stdout, etc within Ruby?如何在 Ruby 中控制子进程标准输入、标准输出等?
【发布时间】:2013-03-01 17:40:40
【问题描述】:

我正在构建一个小脚本,我想在其中启动用户的 shell,但将其重定向为标准输入和标准输出,以便我可以在代码上控制它们。这可能吗?我已经尝试过使用这段代码(虽然这可能是错误的):

new_stdout, new_stdin = IO.pipe
pid = fork {
    $stdout.reopen new_stdin
    exec(ENV['SHELL'])
}

new_stdin.puts "Test"
Process.wait(pid)

这只不过是启动一个新的 shell 实例。

谢谢!

【问题讨论】:

    标签: ruby process fork stdout stdin


    【解决方案1】:

    如果您的程序需要简单性,您可以只使用IO.pipeOpen3.popen3 方法。对于高级用法,我在 cognizant 项目的部分中执行此操作,您可以参考,它使用 Ruby 1.9 的 ::Process::spawn 手动在 https://github.com/Gurpartap/cognizant/blob/master/lib/cognizant/process/execution.rb 妖魔化进程并收集其标准输入/输出/错误流

    【讨论】:

      【解决方案2】:

      大概是这样的吧?

      IO.popen 'sh', 'r+' do |io|
        io.puts 'echo how now brown cow | tr a-z A-Z'
        result = io.gets
        p [:result, result.size, result]
      end
      

      【讨论】:

        猜你喜欢
        • 2014-11-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-01
        • 2020-06-11
        • 2010-09-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多