ruby脚本 - 将输出从一个脚本重定向到另一个脚本

时间:2015-07-08 14:24:26

标签: ruby bash pipeline data-stream

我很确定你们所有人都知道bash管道。我想要做的是从一个ruby脚本读取输出并将其作为输入放入其他ruby脚本

这是我迄今为止成功完成的任务:

生成输出的第一个文件

#two.rb

msg = gets.chomp
IO.write(File.dirname(__FILE__)+'\out.txt',msg)

和第二个处理输入的文件

ruby one.rb | ruby two.rb

现在,cygwin命令(或linux)(侧面问题:这可以在windows cmd或powershell中完成吗?)

{{1}}

并且瞧,创建了out.txt文件,用字符串hello填充。

然而,当我尝试在循环中执行它或处理一些数据流时,比如10.times put'hello'和in循环来读取它,它不起作用。有人可以帮助我完成这个或告诉我如何做到这一点?我只发现了一些python问题,但它是针对不同的东西而且是一些类似bash的方式。

谢谢!

3 个答案:

答案 0 :(得分:3)

不是只读一行(msg = gets.chomp)而是需要遍历stdin行

$stdin.each_line do |msg|
  # ...
end

这不等待生成整个输出,它将处理流,因为第一个进程打印了行(忽略缓冲)。

例如,使用这两个脚本

# one.rb
i = 0
loop { puts i += 1 }

# two.rb
$stdin.each_line { |msg| puts "#{msg.chomp}!" }

第一个具有无限输出,但在运行

时仍会看到输出
ruby one.rb | ruby two.rb

答案 1 :(得分:0)

您需要等到STDIN在第二个脚本中发送EOF

尝试:

#two.rb
msg = ""
while line = gets
  msg += line.chomp
end
IO.write(File.dirname(__FILE__)+'\out.txt',msg)

如果第一个脚本包含10.times { puts "hello" },您将获得:

hellohellohellohellohellohellohellohellohellohello

答案 2 :(得分:-1)

要读取所有输入,请在两个.rb更改

UITabBarController

msg = gets.chomp

如果要逐行阅读,请添加一些命令行标志:

msg = $stdin.read.chomp

和two.rb成为

ruby -n two.rb

在Windows上使用 BEGIN {out = File.open(File.dirname(__FILE__)+"/out.txt", "w")} out.write $_ 代替/即可。