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

ruby script - redirect output from one script to another script

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

这是我到目前为止成功完成的:

生成输出的第一个文件

#one.rb

puts "hello"

和第二个文件来处理输入

#two.rb

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

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

ruby one.rb | ruby two.rb

瞧,out.txt 文件已创建,其中填充了字符串 hello。

但是,当我尝试在循环中执行此操作或处理一些数据流时,例如 10.times puts 'hello' 和 in 循环来读取它,它没有用。有人可以帮我完成这个或告诉我我该怎么做吗?我只找到了一些 python 问题,但它是为了一些不同的东西和一些 bash-like-way.

谢谢!

读取所有输入,在two.rb中更改

msg = gets.chomp

msg = $stdin.read.chomp

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

ruby -n two.rb

并且two.rb变为

  BEGIN {out = File.open(File.dirname(__FILE__)+"/out.txt", "w")}
  out.write $_

在 Windows 上可以使用 / 而不是 \

您需要等到 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

您需要遍历 stdin

的行,而不是只读取一行 (msg = gets.chomp)
$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