12 points par GN⁺ 2024-06-24 | 3 commentaires | Partager sur WhatsApp
  • 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 system ou popen.
    `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 classe Dir.
  • 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

 
yangeok 2024-07-05

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... ?!

 
botplaysdice 2024-06-24

Ruby, que j’ai aimé autrefois… J’espère qu’il restera, même comme ça (?), un langage qui reçoit beaucoup d’amour.

 
GN⁺ 2024-06-24
Avis Hacker News
  • Ruby a hérité de nombreuses capacités de scripting shell de Perl et propose des options permettant d’améliorer progressivement la lisibilité.
  • binding.irb ou binding.pry permettent de déboguer un script de manière interactive.
  • Pathname offre une API plus naturelle que File.
  • Les backticks (`) permettent d’exécuter simplement des commandes shell, mais pour des tâches plus complexes, on peut s’appuyer sur la bibliothèque standard de Ruby.
  • Les threads de Ruby sont faciles à utiliser, et Parallel simplifie encore davantage le traitement parallèle.
  • Ruby 2.6, installé par défaut sur macOS, reste utilisable, mais il vaut mieux passer à une version plus récente.
  • Ruby est un excellent langage, mais le support des éditeurs reste en retrait par rapport à Python.
  • Utiliser les backticks (`) pour exécuter des commandes shell est inefficace et peut se comporter différemment selon l’OS.
  • La gestion des dépendances inline de Ruby est très utile et offre une fonctionnalité proche de celle de Deno.
  • Ruby permet d’écrire un code élégant et convient bien aux petits scripts.
  • Ruby est très utile pour écrire des scripts d’automatisation complexes, avec une approche plus simple que bash ou PowerShell.
  • Ruby est encore largement utilisé pour écrire des scripts et des outils dans les entreprises qui exploitent de grands monolithes Rails.
  • Dans les environnements sans accès à Internet, il est important d’utiliser un langage déjà installé dans la distribution de base.
  • Ruby est utile pour écrire des scripts d’autocomplétion shell et permet de créer rapidement des utilitaires. Rails convient bien à l’écriture d’un MVP.