12 pontos por GN⁺ 2024-06-24 | 3 comentários | Compartilhar no WhatsApp
  • 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 system ou popen.
    `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), reduce e flat_map como 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 classe Dir.
  • 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

 
yangeok 2024-07-05

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

 
botplaysdice 2024-06-24

Ruby, que eu já gostei tanto um dia... Tomara que continue sendo uma linguagem muito querida, nem que seja desse jeito (?)

 
GN⁺ 2024-06-24
Opinião do Hacker News
  • Ruby herdou muitos recursos de scripting de shell do Perl e oferece opções para melhorar gradualmente a legibilidade.
  • Com binding.irb ou binding.pry, é possível depurar interativamente dentro do script.
  • Usar Pathname oferece uma API mais natural do que File.
  • Crases (`) permitem executar comandos de shell simples, mas para tarefas mais complexas é possível aproveitar a biblioteca padrão do Ruby.
  • As threads do Ruby são fáceis de usar, e com Parallel o processamento paralelo fica ainda mais simples.
  • O Ruby 2.6 que vem instalado por padrão no macOS é utilizável, mas é melhor atualizar para uma versão mais recente.
  • Ruby é uma excelente linguagem, mas o suporte dos editores ainda é inferior ao do Python.
  • Usar crases (`) para executar comandos de shell é ineficiente e pode se comportar de forma diferente dependendo do sistema operacional.
  • O recurso de gerenciamento de dependências inline do Ruby é muito útil e oferece algo parecido com o Deno.
  • Ruby permite escrever código bonito e é adequado para criar scripts pequenos.
  • Ruby é muito útil para escrever scripts de automação complexos, e trabalhar com ele pode ser mais fácil do que com bash ou PowerShell.
  • Ruby ainda é muito usado para scripts e ferramentas em empresas que mantêm grandes monólitos em Rails.
  • Em ambientes sem acesso à internet, é importante usar linguagens já instaladas na distribuição padrão.
  • Ruby é útil para escrever scripts de autocompletar de shell e permite criar utilitários rapidamente. Rails é adequado para criar um MVP.