我很确定你们所有人都知道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的方式。
谢谢!
答案 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 $_
代替/
即可。