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

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

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 ответ

Решение

Работа 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"]
Другие вопросы по тегам