我遇到了 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
,也会出现同样的问题。
最佳答案
也许快速浏览一下(有些令人困惑的)文档可以对情况有所了解。如果您查看文档,您最终会看到 OptionParser#make_switch
您可以在其中找到 opt.on
参数的解释:
Long style switch:
Specifies a long style switch which takes a mandatory, optional or no argument. It’s a string of the following form:"--switch=MANDATORY" or "--switch MANDATORY" "--switch[=OPTIONAL]" "--switch"
Short style switch:
Specifies short style switch which takes a mandatory, optional or no argument. It’s a string of the following form:"-xMANDATORY" "-x[OPTIONAL]" "-x"
注意 -xMANDATORY
,然后仔细查看您的 @opts.on
调用:
@opts.on( '-?', '-help','Show this message') do
# ---------------^^^^^
该-help
定义了一个带有必需的elp
参数的-h
选项。据推测,选项解析器将其解释为 -h
是 -?
的别名,并且由于 -h
是使用必需参数定义的, -?
也需要一个参数。如果您使用 --help
(即长样式开关),那么您可能会玩得更好:
@opts.on('-?', '--help', 'Show this message') do
我使用的是 Ruby 2.0 版本,但我怀疑自您使用的旧版 Ruby 以来,选项解析器发生了很大变化。
关于ruby - OptionParser 的 make_switch 错误为 '-?',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19937285/