Передача строки с тире в качестве параметра в Trollop

Я создал довольно простой рубиновый скрипт, который разбирает параметры с Trollop (2.1.2). Он работает нормально, пока я не передаю значение, начинающееся с -параметра as. Образец:

def main
  opts = Trollop::options do
    opt :id, 'Video Id', :type => String
    opt :title, 'Video Title', :type => String
  end

  if opts[:id].nil? 
    Trollop::die :id, 'please specify --id'
  end

и когда я запускаю его с

ruby my_script.rb --id '-WkM3Blu_O8'

это не удается с ошибкой

Error: unknown argument '-W'.
Try --help for help.

Так как я могу справиться с этим делом?

1 ответ

  1. Задача Trollop-анализировать параметры командной строки. Если бы у вас была опция, определенная как «- W», как бы она отличалась от этой опции и аргумента, который начался с «- W»?

    Таким образом, даже если есть опция Trollop, чтобы игнорировать неизвестные параметры и позволить им пройти через в качестве аргументов к вашей программе, если вы определили какие-либо параметры вообще, у вас все равно будет проблема, когда строка начинается с дефиса, за которым следует буква определенной опции.

    Одна вещь, которую вы могли бы сделать, состояла бы в том, чтобы требовать от пользователей, которые хотят начать аргумент с дефиса, предшествовать ему с обратной косой чертой. Это удалось бы скрыть его от Trollop, но затем, прежде чем использовать его, вам нужно будет удалить обратную косую черту. До тех пор, пока обратная косая черта никогда не будет законным символом в строке идентификатора, это должно быть в порядке.

    Кстати вы можете добавить shortопцию:

    require 'trollop'
    opts = Trollop::options do
      opts = Trollop::options do
        opt :id,    'Video Id',    type: String, short: :i
        opt :title, 'Video Title', type: String, short: :t
      end
    end
    
    p opts
    p ARGV
    

    Вы можете попробовать запустить его так, а затем наблюдать результат:

    ➜  stack_overflow git:(master) ✗   ./trollop.rb -i 3 '\-i1'
    {:id=>"3", :title=>nil, :help=>false, :id_given=>true}
    ["\-i1"]