Ruby na Linha de Comando: Um Guia Completo para Desenvolvedores
Se você está usando Ruby como linguagem de script ou desenvolvendo aplicações, dominar o uso da linha de comando é essencial. Neste tutorial abrangente, vamos explorar todas as funcionalidades que o interpretador Ruby oferece através da linha de comando, desde opções básicas até ferramentas avançadas como Rake.
Executando Programas Ruby
A forma mais direta de iniciar o interpretador Ruby é chamando o comando ruby
seguido do nome do arquivo. A estrutura básica é:
ruby ‹ opções › ‹ -- › ‹ arquivo_programa › ‹ argumentos ›*
O exemplo mais simples seria:
$ ruby meu_codigo.rb
Detectando Erros de Sintaxe
Quando há erros de sintaxe, Ruby tenta localizar e sugerir onde está o problema. Vamos criar um exemplo com erro:
class TemUmErro
def este_metodo_termina
p "ele certamente termina"
end
def este_nao_termina
return "uma coisa"
# falta o 'end' aqui!
def este_esta_certo
p "perfeito"
end
end
Ruby mostrará um erro similar a:
syntax error, unexpected end-of-input, expecting 'end' (SyntaxError)
Executando Ruby com a Opção -e
A opção -e
permite executar uma linha de script diretamente, transformando Ruby em uma poderosa calculadora de linha de comando:
$ ruby -e "p (1..5).map { _1 ** 2 }"
[1, 4, 9, 16, 25]
Processando Arquivos com Opções Avançadas
Ruby oferece várias opções poderosas para processar arquivos linha por linha:
Opção -n: Loop Automático
A opção -n
envolve seu código em um loop while gets
:
$ ruby -ne 'puts "linha: #{$_}"' < arquivo_teste
linha: Esta é a linha um
linha: Esta é a linha dois
linha: Esta é a linha três
Opção -p: Loop com Impressão Automática
$ ruby -pe '"linha: #{$_}"' < arquivo_teste
Opção -a: Divisão Automática
Com -a
, cada linha é automaticamente dividida e armazenada em $F
:
$ ruby -nae 'puts "linha: #{$F}"' < arquivo_teste
linha: ["Esta", "é", "a", "linha", "um"]
linha: ["Esta", "é", "a", "linha", "dois"]
Processando Argumentos da Linha de Comando
Array ARGV
Todos os argumentos após o nome do programa ficam disponíveis no array global ARGV
:
# arquivo: teste.rb
ARGV.each { |argumento| p argumento }
Executando:
$ ruby -w teste.rb "Olá Mundo" a1 1.6180
"Olá Mundo"
"a1"
"1.6180"
Importante: Em Ruby, ARGV[0]
é o primeiro argumento para o programa, não o nome do programa. O nome do programa atual está disponível na variável global $0
ou $PROGRAM_NAME
.
Objeto ARGF: Múltiplos Arquivos como Stream Único
Ruby fornece o objeto de conveniência ARGF
que trata múltiplos arquivos como um único stream:
# Processa múltiplos arquivos linha por linha
while (linha = gets)
printf "%d: %10s[%d] %s",
ARGF.lineno,
ARGF.filename,
ARGF.file.lineno,
linha
end
Edição In-Place com ARGF
Ruby permite editar arquivos in-place, mantendo backups. Use a opção -i
com extensão de backup:
# reverter.rb - inverte cada linha
while (linha = gets)
puts linha.chomp.reverse
end
$ ruby -i.bak reverter.rb arquivo_teste outro_arquivo
Parsing Avançado de Opções com OptionParser
Para scripts complexos, Ruby fornece a classe OptionParser
que permite criar interfaces de linha de comando profissionais:
require "optparse"
parser = OptionParser.new
tipo_ordenacao = nil
# Opções curtas e longas
parser.on("-a", "Alfabético") do
tipo_ordenacao = :alfabetico
end
parser.on("--recente", "Mais Recente") do
tipo_ordenacao = :recencia
end
parser.on("-s", "--tamanho", "Tamanho") do
tipo_ordenacao = :tamanho
end
parser.parse!
p "estamos ordenando por #{tipo_ordenacao}"
Opções com Argumentos
parser.on("-dBANCO", "Tipo de Banco de Dados") do |valor|
banco_dados = valor
end
# Argumento opcional (entre colchetes)
parser.on("-a [DIRETORIO]", "Alfabético") do |valor|
diretorio_trabalho = valor || "."
end
Variáveis de Ambiente
Ruby permite acessar e modificar variáveis de ambiente através do objeto ENV
:
# Acessando variáveis de ambiente
puts ENV['SHELL']
puts ENV['HOME']
puts ENV['USER']
# Modificando variáveis (local ao processo)
ENV['MINHA_VAR'] = 'valor_personalizado'
# Removendo variável (definir como nil)
ENV['VAR_TEMPORARIA'] = nil
Dominando o Rake: Automação de Tarefas
Rake é uma poderosa ferramenta de automação que vai muito além de um simples build tool. Vamos criar um exemplo prático:
Criando Seu Primeiro Rakefile
# Rakefile
require "fileutils"
desc "Remove arquivos com nomes terminados em til"
task :deletar_backups_unix do
arquivos = Dir["*~"]
rm(arquivos, verbose: true) unless arquivos.empty?
end
desc "Remove arquivos com extensão .bak"
task :deletar_backups_windows do
arquivos = Dir["*.bak"]
rm(arquivos, verbose: true) unless arquivos.empty?
end
Composição de Tarefas e Dependências
# Tarefa composta com dependências
desc "Remove backups Unix e Windows"
task deletar_backups: [:deletar_backups_unix, :deletar_backups_windows] do
puts "Todos os backups foram deletados"
end
# Tarefa padrão
task default: :deletar_backups
Passando Argumentos para Tarefas Rake
def deletar(diretorio, padrao)
arquivos = Dir["#{diretorio}/#{padrao}"]
rm(arquivos, verbose: true) unless arquivos.empty?
end
desc "Remove backups Unix em diretório específico"
task :deletar_unix, [:dir] do |tarefa, args|
deletar(args[:dir], "*~")
end
Execute com:
$ rake deletar_unix[codigo]
Listando Tarefas Disponíveis
$ rake -T
rake deletar_backups # Remove backups Unix e Windows
rake deletar_backups_unix # Remove arquivos com nomes terminados em til
rake deletar_backups_windows # Remove arquivos com extensão .bak
Criando Executáveis Ruby
Em sistemas Unix, você pode tornar seus scripts Ruby executáveis diretamente:
Configurando o Shebang
#!/usr/bin/env ruby
# Seu código Ruby aqui
puts "Olá, mundo Ruby executável!"
puts "Argumentos recebidos: #{ARGV}"
Torne o arquivo executável:
$ chmod +x meu_script.rb
$ ./meu_script.rb arg1 arg2
Configuração do Caminho de Bibliotecas
Ruby determina onde procurar bibliotecas através da variável $LOAD_PATH
(também conhecida como $:
). Você pode verificar os caminhos atuais:
$ ruby -e 'puts $LOAD_PATH'
Para adicionar caminhos personalizados, use:
# Via variável de ambiente
ENV['RUBYLIB'] = '/caminho/para/biblioteca'
# Via linha de comando
# ruby -I /caminho/para/biblioteca meu_script.rb
# Dentro do programa
$: << '/caminho/para/biblioteca'
Conclusão
Dominar o uso da linha de comando em Ruby abre um universo de possibilidades para automação, processamento de dados e criação de ferramentas eficientes. As funcionalidades que exploramos - desde opções básicas do interpretador até ferramentas avançadas como Rake e OptionParser - formam a base para criar soluções robustas e profissionais.
Os próximos passos incluem experimentar com estes conceitos em seus próprios projetos, explorando opções mais avançadas do Ruby e Rake, e construindo suas próprias ferramentas de linha de comando. Lembre-se: a prática consistente é a chave para dominar essas poderosas funcionalidades do Ruby.
Nenhum comentário:
Postar um comentário