Simuler des tubes (pipe)
Source : http://redhanded.hobix.com/inspect/hoppingThroughPipesAndClosures.html (en)
Le but est de simuler les tubes (pipes), très souvent utilisés en shell. Par exemple :
- ps aux | grep fcgi | wc -l
En ruby, on va d’abord rajouter la méthode « | » à la classe IO
class IO
def | proc
proc[self]
end
end
Ensuite, on crée les commandes, comme suit. Ici, une commande wc (word count) qui compte les lignes d’un flux d’ES.
wc = proc { |io| io.inject(0) { |i, line| i + 1 } }Il suffit ensuite de chainer la commande comme en shell
nombre_de_lignes = open(“/var/log/messages”) | wcEnsuite, on peux améliorer le tout pour pouvoir enchainer plusieurs commandes. Voir le source http://whytheluckystiff.net/ruby/ruby-pipe.rb
require ‘stringio’ module Piping def | proc; proc.call self; end end class IO include Piping def self.[](obj) if obj.respond_to? :read return obj else StringIO.new(obj.to_s) end end end class StringIO include Piping endpuis
wc = proc { |io| IO[io.inject(0) { |i, line| i + 1 }] } grep = proc { |exp| proc { |io| IO[io.grep(exp)] } } nombre_messages_ppp = open(“/var/log/messages”) | grep[/ppp/] | wc p nombre_messages_ppp.readNotons le .read à la fin, car nous enchainons des méthodes qui retournent un flux d’ES.

