Ruby, un gran lenguaje para scripts de shell
(lucasoshiro.github.io)- 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
systemopopen.`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
mapa 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 claseDir. - 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
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?...
Ruby, que alguna vez quise mucho... Ojalá siga siendo un lenguaje que reciba mucho cariño, aunque sea de esta manera (?).
Opinión de Hacker News
binding.irbobinding.pryse puede depurar de manera interactiva dentro de los scripts.Pathnameofrece una API más natural queFile.Parallelel procesamiento en paralelo se vuelve aún más sencillo.