12 puntos por GN⁺ 2024-06-24 | 3 comentarios | Compartir por WhatsApp
  • Ruby suele estar asociado principalmente con el framework Rails, así que a menudo se olvida lo bueno que es este lenguaje
  • Ruby es un lenguaje muy rico y maduro, especialmente útil al escribir scripts de shell complejos
  • Objetivo de este artículo
    • mostrar las funciones de Ruby que resultan útiles al escribir scripts de shell y compararlas con Bash y Python
    • no se trata de reemplazar por completo los scripts de Bash con scripts de Ruby

Función 1: invocar comandos externos

  • En Ruby se usan comillas invertidas (```) para invocar comandos externos.
  • Por ejemplo, con comillas invertidas se puede guardar la salida de un comando externo en una variable.
  • También se puede usar system o popen.
    `ls`  
    
  • Es posible guardar la salida del comando en una variable.
    my_date=`date`  
    

Función 2: código de estado

  • Se puede comprobar el código de estado del último comando usando la variable $?
  • Es muy similar a Bash
    `true`  
    puts $? # 0  
    `false`  
    puts $? # 1  
    

Función 3: lenguaje tipado

  • Ruby no es un lenguaje de tipos estáticos, pero sí tiene tipos.
  • Es un lenguaje orientado a objetos, así que todo se trata como un objeto.
  • A diferencia de Bash, se pueden usar con seguridad tipos distintos de cadenas.
    total_lines = `wc -l my_file`.to_i # entero con la cantidad de líneas del archivo  
    half = total_lines.div 2           # división entera  
    puts `head -n #{half} my_file`     # imprime la mitad del archivo  
    

Función 4: composición funcional

  • Ruby implementa operaciones funcionales como map, select (filtro), reduce, flat_map, etc., como métodos.
  • Se puede aplicar map a la salida de un comando.
    puts `ls`.lines.map { |name| name.strip.length } # imprime la longitud de los nombres de archivo  
    

Función 5: coincidencia con expresiones regulares

  • En Ruby, las expresiones regulares son un tipo y las operaciones para usarlas vienen integradas.
  • Por ejemplo, una forma de obtener el nombre de la rama actual de git:
    current_branch_regex = /^\* (\S+)/  
    output_lines = `git branch`.lines  
    output_lines.each do |line|  
      if line =~ current_branch_regex # coincidencia entre cadena y expresión regular  
        puts $1                       # imprime la coincidencia del primer grupo  
      end  
    end  
    

Función 6: hilos sencillos

  • Ruby hace que trabajar con múltiples hilos sea muy fácil
  • Por ejemplo, resulta útil al descargar varios archivos al mismo tiempo
    (1..10).map do |i|                       # itera del 1 al 10  
      Thread.new do  
        `wget http://my_site.com/file_#{i}`  # se pueden usar variables dentro del comando  
      end  
    end.each { |thread| thread.join }        # do/end y llaves tienen el mismo propósito  
    

Función 7: operaciones integradas con archivos y directorios

  • En Ruby, todas las operaciones con archivos se ofrecen como métodos de la clase File, y las operaciones con directorios como métodos de la clase Dir.
  • A diferencia de Python, se puede trabajar con archivos y directorios de forma consistente.
    exists = File.exists? 'My File'           # los métodos que devuelven booleanos terminan en '?'  
    file_content = File.open('My File').read  
    File.delete 'My File'                     # los paréntesis son opcionales si no hay ambigüedad  
    

Conclusión

  • Se recomienda considerar Ruby para reemplazar scripts de shell complejos
  • Por supuesto, esto no significa abandonar Bash por completo, pero en tareas complejas Ruby puede ser una mejor opción
  • También se puede hacer con Python, Perl, JS, etc., pero personalmente Ruby es el lenguaje más completo y fácil de usar

Opinión de GN⁺

  • Ruby admite tanto programación orientada a objetos como programación funcional, por lo que puede adaptarse a diversos estilos de programación.
  • En comparación con Python, Ruby sigue un paradigma orientado a objetos más estricto.
  • Al escribir scripts de shell, las ventajas de Ruby se vuelven más evidentes cuanto mayor es la complejidad.
  • La capacidad de Ruby para manejar hilos permite implementar tareas en paralelo con facilidad.
  • Las operaciones con archivos y directorios se ofrecen de forma intuitiva y consistente, lo que mejora la productividad.

3 comentarios

 
yangeok 2024-07-05

Se ve que también sirve bien para scripting jaja. No sé la versión, pero también viene instalado por defecto en macOS, ¿no?...

 
botplaysdice 2024-06-24

Ruby, que alguna vez quise mucho... Ojalá siga siendo un lenguaje que reciba mucho cariño, aunque sea de esta manera (?).

 
GN⁺ 2024-06-24
Opinión de Hacker News
  • Ruby heredó muchas capacidades de scripting de shell de Perl y ofrece opciones para mejorar la legibilidad de forma gradual.
  • Con binding.irb o binding.pry se puede depurar de manera interactiva dentro de los scripts.
  • Pathname ofrece una API más natural que File.
  • Las comillas invertidas (`) permiten ejecutar comandos de shell simples, pero para tareas más complejas se puede aprovechar la biblioteca estándar de Ruby.
  • Los hilos de Ruby son fáciles de usar, y con Parallel el procesamiento en paralelo se vuelve aún más sencillo.
  • Ruby 2.6, que viene preinstalado en MacOS, es usable, pero conviene actualizar a una versión más reciente.
  • Ruby es un gran lenguaje, pero el soporte de los editores es inferior al de Python.
  • Usar comillas invertidas (`) para ejecutar comandos de shell es ineficiente y puede comportarse distinto según el sistema operativo.
  • La función de gestión de dependencias en línea de Ruby es muy útil y ofrece algo parecido a Deno.
  • Ruby permite escribir código elegante y es ideal para scripts pequeños.
  • Ruby es muy útil para escribir scripts de automatización complejos, y facilita el trabajo más que bash o powershell.
  • Ruby todavía se usa mucho para scripting y herramientas en empresas que mantienen grandes monolitos de Rails.
  • En entornos sin acceso a internet, es importante usar un lenguaje que ya venga instalado en la distribución base.
  • Ruby es útil para escribir scripts de autocompletado de shell y permite crear utilidades rápidamente. Rails es adecuado para crear MVPs.