¿Cómo obtener el argumento de la línea de comando usando optparse?

2023-01-25 04:20:19

Estoy trabajando en una herramienta de búsqueda de línea de comando que busca a través de los archivos de origen utilizando una palabra clave determinada. Uso optparse para analizar las opciones de la línea de comandos. Por ahora se ve así:

qs -p ~/Desktop/project -k line

si no se proporciona ningún argumento -p, uso el directorio predeterminado (actual):

qs -k line

Pero, lo que realmente quiero es hacer lo mismo que arriba pero sin -k, así:

qs line

Por ahora tengo esto:

OptionParser.new do |options|

  options.banner = "Usage: qs [options] [path] [keyword]\n" \
                   "\nSearch through files for a given keyword at specified path.\n" \
                   "If path is no specified current directory used by default."

  options.separator ""
  options.separator "Specific options:"

  options.on("--no-rec", "Looking in files only at that level.") do |r|
    $values[:recursion] = r
  end

  options.on('-p', '--path PATH', String, 'Path where to start search') do |path|
    $values[:path] = path
  end

  options.on('-k', '--key WORD', String, 'Word you are looking for ') do |key|
    $values[:keyword] = key
  end    

  options.on_tail("-h" , "--help", "Help documentation.") do
    $stderr.puts options
    exit 1
  end
end.parse!

Como puede ver, es imposible hacer algo como esto:

$values[:keyword] = ARGV[2]

porque no hay garantía de que todos los argumentos estén presentes.

¿Es posible hacer esto sin perder todo el apoyo de optparse?

Gracias de antemano.

- SuperManEver

Source
zh
Responder


0
  • Cuando usa parse! (con !), Optparse elimina las opciones de ARGV, por lo que luego cualquier otro los elementos (que Optparse no reconoce) estarán en ARGV[0] en adelante.

    Entonces deberías poder hacer algo como esto:

    OptionParser.new do |options|
      # as before, but without k option
    end.parse!
    
    # At this point all the options optparse knows about will be
    # removed from ARGV, so you can get at what's left:
    $values[:keyword] = ARGV[0]