1

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

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

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

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

谢谢!

4

2 回答 2

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
于 2013-03-13T17:06:19.310 回答
0

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

于 2013-03-13T17:03:02.007 回答