ruby command-line

Pasa las variables al script de Ruby a través de la línea de comandos



ruby argv (6)

He instalado RubyInstaller en Windows y ejecuto IMAP Sync pero necesito usarlo para sincronizar cientos de cuentas. Si pudiera pasarle estas variables a través de la línea de comandos, podría automatizar mejor todo el proceso.

# Source server connection info. SOURCE_NAME = ''[email protected]'' SOURCE_HOST = ''mail.example.com'' SOURCE_PORT = 143 SOURCE_SSL = false SOURCE_USER = ''username'' SOURCE_PASS = ''password'' # Destination server connection info. DEST_NAME = ''[email protected]'' DEST_HOST = ''imap.gmail.com'' DEST_PORT = 993 DEST_SSL = true DEST_USER = ''[email protected]'' DEST_PASS = ''password''


A menos que sea el caso más trivial, solo hay una forma sensata de usar las opciones de línea de comandos en Ruby. Se llama docopt y se documenta here .

Lo sorprendente de esto es su simplicidad. Todo lo que tiene que hacer es especificar el texto de "ayuda" para su comando. Lo que escriba allí se analizará automáticamente por la biblioteca independiente (!) Ruby.

Del example :

#!/usr/bin/env ruby require ''docopt.rb'' doc = <<DOCOPT Usage: #{__FILE__} --help #{__FILE__} -v... #{__FILE__} go [go] #{__FILE__} (--path=<path>)... #{__FILE__} <file> <file> Try: #{__FILE__} -vvvvvvvvvv #{__FILE__} go go #{__FILE__} --path ./here --path ./there #{__FILE__} this.txt that.txt DOCOPT begin require "pp" pp Docopt::docopt(doc) rescue Docopt::Exit => e puts e.message end

La salida:

$ ./counted_example.rb -h Usage: ./counted_example.rb --help ./counted_example.rb -v... ./counted_example.rb go [go] ./counted_example.rb (--path=<path>)... ./counted_example.rb <file> <file> Try: ./counted_example.rb -vvvvvvvvvv ./counted_example.rb go go ./counted_example.rb --path ./here --path ./there ./counted_example.rb this.txt that.txt $ ./counted_example.rb something else {"--help"=>false, "-v"=>0, "go"=>0, "--path"=>[], "<file>"=>["something", "else"]} $ ./counted_example.rb -v {"--help"=>false, "-v"=>1, "go"=>0, "--path"=>[], "<file>"=>[]} $ ./counted_example.rb go go {"--help"=>false, "-v"=>0, "go"=>2, "--path"=>[], "<file>"=>[]}

¡Disfrutar!


Algo como esto:

ARGV.each do|a| puts "Argument: #{a}" end

entonces

$ ./test.rb "test1 test2"

o

v1 = ARGV[0] v2 = ARGV[1] puts v1 #prints test1 puts v2 #prints test2


Desafortunadamente, Ruby no admite un mecanismo de paso como, por ejemplo, AWK:

> awk -v a=1 ''BEGIN {print a}'' > 1

Significa que no puede pasar valores nombrados directamente a su script.

Usar opciones de cmd puede ayudar:

> ruby script.rb val_0 val_1 val_2 # script.rb puts ARGV[0] # => val_0 puts ARGV[1] # => val_1 puts ARGV[2] # => val_2

Ruby almacena todos los argumentos de cmd en la matriz ARGV , el propio nombre de script se puede capturar usando la variable $PROGRAM_NAME .

La desventaja obvia es que usted depende del orden de los valores.

Si solo necesita conmutadores booleanos, use la opción -s del intérprete de Ruby:

> ruby -s -e ''puts "So do I!" if $agreed'' -- -agreed > So do I!

Por favor, tenga en cuenta el cambio, de lo contrario, Ruby se quejará de una opción inexistente, de -agreed , así que -agreed como interruptor a su invocación de cmd. No lo necesitas en el siguiente caso:

> ruby -s script_with_switches.rb -agreed > So do I!

La desventaja es que se mete con las variables globales y solo tiene valores lógicos de verdadero / falso.

Puede acceder a los valores de las variables de entorno:

> FIRST_NAME=''Andy Warhol'' ruby -e ''puts ENV["FIRST_NAME"]'' > Andy Warhol

Los inconvenientes que se presentan aquí son: debe configurar todas las variables antes de la invocación del script (solo para su proceso de ruby) o exportarlas (shells como BASH):

> export FIRST_NAME=''Andy Warhol'' > ruby -e ''puts ENV["FIRST_NAME"]''

En este último caso, sus datos serán legibles para todos en la misma sesión de shell y para todos los subprocesos, lo que puede ser una seria implicación de seguridad.

Y al menos puede implementar un analizador de opciones usando getoptlong y optparse .

¡Feliz piratería!


Ejecute este código en la línea de comando e ingrese el valor de N:

N = gets; 1.step(N.to_i, 1) { |i| print "hello world/n" }


No reinventes la rueda; Echa un vistazo a la genial OptionParser Ruby OptionParser .

Ofrece análisis de indicadores / interruptores, parámetros con valores opcionales o requeridos, puede analizar listas de parámetros en una sola opción y puede generar su ayuda por usted.

Además, si alguna de su información que se pasa es bastante estática, eso no cambia entre ejecuciones, póngala en un archivo YAML que se analiza. De esa manera, puede tener cosas que cambian cada vez en la línea de comandos, y cosas que cambian ocasionalmente configuradas fuera de su código. Esa separación de datos y código es buena para el mantenimiento.

Aquí hay algunas muestras para jugar:

require ''optparse'' require ''yaml'' options = {} OptionParser.new do |opts| opts.banner = "Usage: example.rb [options]" opts.on(''-n'', ''--sourcename NAME'', ''Source name'') { |v| options[:source_name] = v } opts.on(''-h'', ''--sourcehost HOST'', ''Source host'') { |v| options[:source_host] = v } opts.on(''-p'', ''--sourceport PORT'', ''Source port'') { |v| options[:source_port] = v } end.parse! dest_options = YAML.load_file(''destination_config.yaml'') puts dest_options[''dest_name'']

Este es un archivo YAML de muestra si sus destinos son bastante estáticos:

--- dest_name: [email protected] dest_host: imap.gmail.com dest_port: 993 dest_ssl: true dest_user: [email protected] dest_pass: password

Esto te permitirá generar fácilmente un archivo YAML:

require ''yaml'' yaml = { ''dest_name'' => ''[email protected]'', ''dest_host'' => ''imap.gmail.com'', ''dest_port'' => 993, ''dest_ssl'' => true, ''dest_user'' => ''[email protected]'', ''dest_pass'' => ''password'' } puts YAML.dump(yaml)


También puedes probar cliqr . Es bastante nuevo y en activo desarrollo. Pero hay versiones estables listas para ser utilizadas. Aquí está el repositorio de git: https://github.com/anshulverma/cliqr

Mire en la carpeta de ejemplos para tener una idea de cómo se puede usar.