À l’écriture d’un script ruby on a tendance à utiliser ARGV, pour lire les paramètres entrants.
Généralement cela représente le chemin d’un fichier.
Admettons que je veuille un script tout simple qui rajoute le numéro de chaque ligne:
File.open(ARGV.shift) do |f|
f.each_line do |line|
puts "#{f.lineno}: #{line}"
end
end
Un appel type ./pipe.rb datas.csv
fonctionne très bien mais comment faire en sorte que mon
script soit réutilisable et que je puisse lui passer du contenu en entrée type:
$ echo "foo,bar\nbaz,coin" | ./pipe.rb
./pipe.rb:4:in `initialize': can't convert nil into String (TypeError)
Nous avons besoin que notre script suive les principes UNIX et puisse être utilisé avec des pipes, en sortie ou en entrée.
Pour cela nous avons à disposition ARGF. ARGF se comporte comme un flux qui est capable d’utiliser l’entrée standard (STDIN) ou un fichier. Notre script va donc se transformer en:
while file = ARGF.gets
file.each_line do |line|
puts "#{ARGF.lineno}: #{line}"
end
end
La sortie (STDOUT) de echo va directement venir alimenter l’entrée de notre script ruby (STDIN) avec le résultat suivant:
echo "foo,bar\nbaz,coin" | ./pipe.rb
1: foo,bar
2: baz,coin
À noter que cela fonctionne également avec un tail -f, exemple:
$ tail -f feed.csv | ./pipe.rb
$ echo "foo,bar\nbaz,coin" > feed.csv
1: foo,bar
2: baz,coin
De la même façon la sortie de notre script peut être réutilisée dans l’entrée d’un utilitaire GNU.
cat datas.csv | ./pipe.rb | grep 'Synbioz' > results
J’espère que ces quelques lignes de Ruby (5!) vous permettrons d’agrémenter vos scripts.
Si vous avez d’autres astuces / bonnes pratiques à partager, n’hésitez pas.
L’équipe Synbioz.
Libres d’être ensemble.