在OptionParser中,我可以强制设置一个选项,但是如果我省略了这个值,它将接受后面任何选项的名称作为值,这会搞乱命令行解析的其余部分。下面是一个测试用例,它反映了选项的值:
$ ./test_case.rb --input foo --output bar
output bar
input foo
现在省略第一个选项的值:
$ ./test_case.rb --input --output bar
input --output
有什么方法可以防止它接受另一个选项名作为值吗?谢谢!
测试用例代码如下:
#!/usr/bin/env ruby
require 'optparse'
files = Hash.new
option_parser = OptionParser.new do |opts|
opts.on('-i', '--input FILENAME', 'Input filename - required') do |filename|
files[:input] = filename
end
opts.on('-o', '--output FILENAME', 'Output filename - required') do |filename|
files[:output] = filename
end
end
begin
option_parser.parse!(ARGV)
rescue OptionParser::ParseError
$stderr.print "Error: " + $! + "\n"
exit
end
files.keys.each do |key|
print "#{key} #{files[key]}\n"
end
发布于 2010-03-31 23:47:20
你想做的不是一个好主意。如果你真的有一个名为"--output“的文件呢?这是Unix上完全有效的文件名。每个Unix程序的选项解析的工作方式与ruby一样,所以您不应该更改它,因为这样您的程序将与其他程序完全不同,这是令人困惑的,并且违反了“最小惊讶原则”。
真正的问题是:为什么你一开始就有这个问题?也许您正在从另一个程序运行您的程序,而父程序提供了一个空文件名作为--input的参数,这使它看到--output作为--input的参数。您可以通过始终引用您在命令行传递的文件名来解决此问题:
./test_case.rb --input "" --output "bar"
然后--输入将为空,这很容易检测到。
还要注意,如果--input设置为--output (并且--output不是一个真正的文件),您可以只尝试打开--input文件。如果失败,则打印如下消息:
can't open input file: --output: file not found
这应该让用户清楚他们做错了什么。
发布于 2012-02-01 19:27:56
试试这个:
opts.on('-i', '--input FILENAME', 'Input filename - required') do |filename|
files[:input] = filename
end
opts.on('-o', '--output FILENAME', 'Output filename - required') do |filename|
files[:output] = filename
end
opts.on("-h", "--help", "Show this message") do
puts opts
exit
end
begin
ARGV << "-h" if ARGV.size != 2
option_parser.parse!(ARGV)
rescue OptionParser::ParseError
$stderr.print "Error: " + $! + "\n"
exit
end
发布于 2010-03-31 04:00:09
在这种情况下,缺少强制的--output
选项,因此请在调用parse!
之后执行此操作
unless files[:input] && files[:output]
$stderr.puts "Error: you must specify both --input and --output options."
exit 1
end
https://stackoverflow.com/questions/2547201
复制相似问题