Ruby, un excellent langage pour les scripts shell
(lucasoshiro.github.io)- Ruby est surtout associé au framework Rails, ce qui fait qu’on oublie souvent ses grandes qualités
- Ruby est un langage très riche et abouti, particulièrement utile pour écrire des scripts shell complexes
- Objectif de cet article
- montrer les fonctionnalités de Ruby utiles pour écrire des scripts shell, et les comparer à Bash et Python
- il ne s’agit pas de remplacer complètement les scripts Bash par des scripts Ruby
Fonction 1 : appeler des commandes externes
- En Ruby, on utilise des backticks (```) pour appeler des commandes externes.
- Par exemple, les backticks permettent de stocker la sortie d’une commande externe dans une variable.
- On peut aussi utiliser
systemoupopen.`ls` - Il est possible de stocker la sortie d’une commande dans une variable.
my_date=`date`
Fonction 2 : codes de retour
- La variable
$?permet de vérifier le code de retour de la dernière commande - C’est très similaire à Bash
`true` puts $? # 0 `false` puts $? # 1
Fonction 3 : langage typé
- Ruby n’est pas un langage à typage statique, mais il possède des types.
- C’est un langage orienté objet, où tout est traité comme un objet.
- Contrairement à Bash, on peut y utiliser en toute sécurité d’autres types que les chaînes de caractères.
total_lines = `wc -l my_file`.to_i # entier contenant le nombre de lignes du fichier half = total_lines.div 2 # division entière puts `head -n #{half} my_file` # affiche la moitié du fichier
Fonction 4 : composition fonctionnelle
- Ruby implémente des opérations fonctionnelles comme
map,select(filtre),reduce,flat_map, etc. sous forme de méthodes. - On peut appliquer
mapà la sortie d’une commande.puts `ls`.lines.map { |name| name.strip.length } # affiche la longueur des noms de fichiers
Fonction 5 : correspondance par expressions régulières
- En Ruby, les expressions régulières sont un type, avec des opérations intégrées pour les utiliser.
- Par exemple, voici comment récupérer le nom de la branche git courante :
current_branch_regex = /^\* (\S+)/ output_lines = `git branch`.lines output_lines.each do |line| if line =~ current_branch_regex # correspondance entre chaîne et expression régulière puts $1 # affiche la correspondance du premier groupe end end
Fonction 6 : des threads faciles à utiliser
- Ruby rend la gestion de plusieurs threads très simple
- Par exemple, c’est utile pour télécharger plusieurs fichiers en même temps
(1..10).map do |i| # itère de 1 à 10 Thread.new do `wget http://my_site.com/file_#{i}` # on peut utiliser des variables dans la commande end end.each { |thread| thread.join } # do/end et les accolades ont le même rôle
Fonction 7 : opérations intégrées sur les fichiers et répertoires
- En Ruby, toutes les opérations sur les fichiers sont fournies comme méthodes de la classe
File, et les opérations sur les répertoires comme méthodes de la classeDir. - Contrairement à Python, on peut manipuler fichiers et répertoires de manière cohérente.
exists = File.exists? 'My File' # les méthodes qui renvoient un booléen se terminent par '?' file_content = File.open('My File').read File.delete 'My File' # les parenthèses sont facultatives si cela ne crée pas d’ambiguïté
Conclusion
- Il est recommandé d’envisager Ruby pour remplacer des scripts shell complexes
- Il ne s’agit évidemment pas d’abandonner complètement Bash, mais pour les tâches complexes Ruby peut être un meilleur choix
- On peut aussi le faire avec Python, Perl, JS, etc., mais personnellement Ruby est le langage le plus complet et le plus simple à utiliser
Avis de GN⁺
- Ruby prend en charge à la fois la programmation orientée objet et la programmation fonctionnelle, ce qui lui permet d’accommoder différents styles de programmation.
- Par rapport à Python, Ruby suit un paradigme orienté objet plus strict.
- Lors de l’écriture de scripts shell, plus la complexité augmente, plus les avantages de Ruby deviennent évidents.
- Les fonctionnalités de gestion des threads de Ruby facilitent l’implémentation de tâches parallèles.
- Les opérations sur les fichiers et répertoires sont proposées de façon intuitive et cohérente, ce qui améliore la productivité.
3 commentaires
On peut aussi très bien l’utiliser pour du scripting, haha. Je ne connais pas la version, mais il est installé par défaut sur Mac aussi, non... ?!
Ruby, que j’ai aimé autrefois… J’espère qu’il restera, même comme ça (?), un langage qui reçoit beaucoup d’amour.
Avis Hacker News
binding.irboubinding.prypermettent de déboguer un script de manière interactive.Pathnameoffre une API plus naturelle queFile.Parallelsimplifie encore davantage le traitement parallèle.