OptionParser的make_switch错误带' - ?'

时间:2013-11-12 18:39:10

标签: ruby optparse

我遇到了OptionParser make_switch的问题。

我的代码解析了三个参数并运行测试以查看我的MANDATORY参数是否在此处:

 #!/usr/bin/env ruby

 require 'optparse'
 require 'ostruct'

options = OpenStruct.new
@argv = ARGV

optparse = OptionParser.new do |opts|

  @opts=opts

  usage = "USAGE: ./#{File.basename($0)} [-v] -p xxxxxx"
  @opts.banner = usage

  @opts.on( '-p', '--pdu [PDU]', 'Specify a PDU to configure') do |res|
    options.pdu = true
    $pdu_name = res
  end

  @opts.on( '-v', '--[no-]verbose', 'Run verbosely') do
    options.verbose = true
  end

  @opts.on( '-?', '-help','Show this message') do
    puts "Help Me!"        
    puts @opts
    exit 1
  end
end

begin
    if not @argv.empty?
      optparse.order!(@argv)
      if !options.pdu
        $stderr.puts "Options -p missing."
        $stderr.puts "#{@opts}\n\n"
        exit 1
      end
    else
      $stderr.puts "ERROR: Arguments Required."
      $stderr.puts "#{@opts}\n\n"
      exit 1
    end
  rescue OptionParser::InvalidOption
    $stderr.puts "ERROR: Invalid option."
    $stderr.puts "#{@opts}\n\n"
    exit 1
end  

除了-?之外,一切正常:

xxx$ ./myscript.rb -?
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/optparse.rb:451:in 
`parse': missing argument: -? (OptionParser::MissingArgument)
from /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/optparse.rb:1295:in `parse_in_order'
from /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/optparse.rb:1254:in `catch'
from /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/optparse.rb:1254:in `parse_in_order'
from /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/optparse.rb:1248:in `order!'
blabla

然而-help完美无缺:

xxxx$ ./myscript.rb -help
Help me!
USAGE: ./myscript.rb [-v] -p xxxxxx
    -p, --pdu [PDU]                  Specify a PDU to configure
    -v, --[no-]verbose               Run verbosely
    -?, -help                        Show this message

更令人惊讶的是,-? -v也有效:

xxxx$ ./myscript.rb -? -v
Help Me!
USAGE: ./myscript.rb [-v] -p xxxxxx
    -p, --pdu [PDU]                  Specify a PDU to configure
    -v, --[no-]verbose               Run verbosely
    -?, -help                        Show this message

我做错了什么?

如果我在代码中将-?替换为-h,则会出现同样的问题。

1 个答案:

答案 0 :(得分:2)

或许快速查看(有些令人困惑的)文档会对情况有所了解。如果您查看文档,最终会在OptionParser#make_switch处找到opt.on参数的解释:

  

长款开关:
  指定长样式开关,该开关采用强制,可选或无参数。它是以下形式的字符串:

"--switch=MANDATORY" or "--switch MANDATORY"
"--switch[=OPTIONAL]"
"--switch"
     

短款式开关:
  指定短样式开关,它采用强制,可选或无参数。它是以下形式的字符串:

"-xMANDATORY"
"-x[OPTIONAL]"
"-x"

请注意-xMANDATORY,然后仔细查看@opts.on电话:

@opts.on( '-?', '-help','Show this message') do
# ---------------^^^^^

-help定义了-h选项,其中包含必需的elp参数。据推测,选项解析器将其解释为-h-?的别名,并且由于-h是使用必需参数定义的,因此-?也需要参数。如果您使用--help(即长样式切换),那么您可能会有更好的时间:

@opts.on('-?', '--help', 'Show this message') do

我使用的是Ruby 2.0版本,但我怀疑自从您使用的旧版Ruby以来,选项解析器已经发生了很大的变化。