Ruby, uma ótima linguagem para scripts de shell
(lucasoshiro.github.io)- Ruby é principalmente associada ao framework Rails, então muitas vezes acabamos esquecendo o que essa linguagem tem de tão bom
- Ruby é uma linguagem muito rica e madura, especialmente útil para escrever scripts de shell complexos
- Objetivos deste texto
- mostrar recursos do Ruby que são úteis ao escrever scripts de shell e compará-los com Bash e Python
- não se trata de substituir completamente scripts Bash por scripts Ruby
Recurso 1: chamar comandos externos
- No Ruby, usa-se crases (```) para chamar comandos externos.
- Por exemplo, com crases é possível salvar a saída de um comando externo em uma variável.
- Também é possível usar
systemoupopen.`ls` - Também é possível armazenar a saída do comando em uma variável.
my_date=`date`
Recurso 2: código de status
- É possível verificar o código de status do último comando usando a variável
$? - Muito semelhante ao Bash
`true` puts $? # 0 `false` puts $? # 1
Recurso 3: linguagem com tipos
- Ruby não é uma linguagem de tipagem estática, mas possui tipos.
- É uma linguagem orientada a objetos em que tudo é tratado como objeto.
- Diferentemente do Bash, é possível usar com segurança tipos além de strings.
total_lines = `wc -l my_file`.to_i # inteiro com o número de linhas do arquivo half = total_lines.div 2 # divisão inteira puts `head -n #{half} my_file` # imprime metade do arquivo
Recurso 4: composição funcional
- Ruby implementa operações funcionais como
map,select(filtro),reduceeflat_mapcomo métodos. - É possível aplicar
mapà saída de um comando.puts `ls`.lines.map { |name| name.strip.length } # imprime o comprimento dos nomes dos arquivos
Recurso 5: correspondência com expressões regulares
- No Ruby, expressões regulares são um tipo, e operações que usam regex já vêm embutidas.
- Por exemplo, uma forma de obter o nome do branch atual do git:
current_branch_regex = /^\* (\S+)/ output_lines = `git branch`.lines output_lines.each do |line| if line =~ current_branch_regex # faz correspondência entre string e expressão regular puts $1 # imprime a correspondência do primeiro grupo end end
Recurso 6: threads fáceis
- Ruby torna muito fácil lidar com várias threads
- Por exemplo, isso é útil ao baixar vários arquivos ao mesmo tempo
(1..10).map do |i| # repete de 1 a 10 Thread.new do `wget http://my_site.com/file_#{i}` # é possível usar variáveis dentro do comando end end.each { |thread| thread.join } # do/end e chaves têm a mesma finalidade
Recurso 7: operações embutidas de arquivos e diretórios
- No Ruby, todas as operações com arquivos são fornecidas como métodos da classe
File, e as operações com diretórios como métodos da classeDir. - Diferentemente do Python, é possível lidar com arquivos e diretórios de forma consistente.
exists = File.exists? 'My File' # métodos que retornam booleano terminam com '?' file_content = File.open('My File').read File.delete 'My File' # parênteses são opcionais quando não houver ambiguidade
Conclusão
- Recomenda-se considerar Ruby ao substituir scripts de shell complexos
- Claro, isso não significa abandonar completamente o Bash, mas em tarefas mais complexas Ruby pode ser uma escolha melhor
- Também dá para fazer isso com Python, Perl, JS etc., mas pessoalmente Ruby parece ser a linguagem mais completa e fácil de usar
Opinião do GN⁺
- Ruby oferece suporte tanto à orientação a objetos quanto à programação funcional, acomodando diferentes estilos de programação.
- Em comparação com Python, Ruby segue um paradigma de orientação a objetos mais rígido.
- Ao escrever scripts de shell, as vantagens do Ruby ficam mais evidentes à medida que a complexidade aumenta.
- Os recursos de tratamento de threads do Ruby facilitam a implementação de trabalhos paralelos.
- As operações com arquivos e diretórios são oferecidas de forma intuitiva e consistente, aumentando a produtividade.
3 comentários
Parece que dá para usar para scripts também haha. Não sei a versão, mas já vem instalado por padrão no Mac, né...?
Ruby, que eu já gostei tanto um dia... Tomara que continue sendo uma linguagem muito querida, nem que seja desse jeito (?)
Opinião do Hacker News
binding.irboubinding.pry, é possível depurar interativamente dentro do script.Pathnameoferece uma API mais natural do queFile.Parallelo processamento paralelo fica ainda mais simples.