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
我很确定你们都知道 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