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 :

  1. 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”) | wc

Ensuite, 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 end

puis

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.read

Notons le .read à la fin, car nous enchainons des méthodes qui retournent un flux d’ES.