1

我很确定你们都知道 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' 和循环读取它,它不起作用。有人可以帮我完成这个或告诉我我该怎么做吗?我只找到了一些 python 问题,但它是针对不同的和类似 bash 的方式。

谢谢!

4

3 回答 3

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
于 2015-07-08T14:38:50.090 回答
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
于 2015-07-08T14:36:59.280 回答
-1

要读取所有输入,在 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 上使用/代替是可以的。\

于 2015-07-08T14:35:54.043 回答