Rubypipes如何将两个子进程的输出连接在一起?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (13)

有没有一种自动化的方式来在Ruby中执行shell?我试图将下面的shell代码转换成Ruby:

a | b | c... > ...

但到目前为止我发现的唯一解决方案是自己做缓冲区管理:

a = IO.popen('a')
b = IO.popen('b', 'w+')
Thread.new(a, b) { |in, out|
    out.write(in.readpartial(4096)) until in.eof?
    out.close_write
}
# deal with b.read...

提问于
用户回答回答于

如果abc通常是从命令行访问的命令,那么可以使用:

captured_output = `a | b | c`

Ruby将在子shell中运行命令,并捕获STDOUT。

如果出于某种原因需要将输出routes到文件,那么也可以将重定向添加到命令中。在这种情况下,STDOUT将不会返回,但可以打开该文件并手动处理它:

`a | b | c > captured_output`
File.foreach('captured_output') do |li|
  print li
end

它不提供尽可能多的控制,使用systempopen3,但它方便:

>> sin, sout, serr = Open3.popen3('ls -al | tail -1') #=> [#<IO:fd 4>, #<IO:fd 5>, #<IO:fd 7>, #<Thread:0x00000100bb8798 run>]
>> sout.read #=> "drwxr-xr-x   3 greg  staff    102 Nov  2 21:01 python\n"
用户回答回答于

简而言之 :

sh = Shell.new
sh.system("a") | sh.system("b") | sh.system("c")

也可以更难一些

sh.echo(my_string) | sh.system("wc") > "file_path"
xml = (sh.echo(html) | sh.system("tidy", "-q")).to_s

扫码关注云+社区