编辑:请,请,在回复之前,请阅读这篇文章底部列出的两个要求。人们不断地发布他们的新的gem和库之类的东西,这显然不符合要求。
有时,我想非常便宜地将一些命令行选项编译到一个简单的脚本中。做这件事的一个有趣的方法是,不用处理getopts或解析或类似的事情:
...
$quiet = ARGV.delete('-d')
$interactive = ARGV.delete('-i')
...
# Deal with ARGV as usual here, maybe using ARGF or whatever.
它不完全是普通的Unix options语法,因为它可以接受选项的非选项命令行参数,比如"myprog -i foo bar -q
",但我可以接受。(有些人,比如Subversion开发人员,更喜欢这种方式。有时我也会这样做。)
只存在或不存在的选项不能比上面更简单地实现。(一次赋值,一次函数调用,一个副作用。)有没有一种同样简单的方法来处理带有参数的选项,比如"-f
文件名“?
编辑:
有一点我之前没有说过,因为直到Trollop的作者提到这个库适合“在一个800行的文件中”时,我才明白这一点,那就是我不仅要寻找干净的语法,还要寻找一种具有以下特征的技术:
RubyRuby1.8.5-7可以将整个代码包含在脚本文件中(而不会淹没实际的脚本本身,它可能只有几十行),这样用户就可以在任何安装了标准 1.8.5-7的系统上拖放bin
目录中的单个文件并使用它。如果您不能编写没有Require语句的Ruby脚本,并且解析几个选项的代码少于十几行,那么您就失败了,这段requirement.
发布于 2009-06-19 10:47:40
以下是我通常使用的标准技术:
#!/usr/bin/env ruby
def usage(s)
$stderr.puts(s)
$stderr.puts("Usage: #{File.basename($0)}: [-l <logfile] [-q] file ...")
exit(2)
end
$quiet = false
$logfile = nil
loop { case ARGV[0]
when '-q' then ARGV.shift; $quiet = true
when '-l' then ARGV.shift; $logfile = ARGV.shift
when /^-/ then usage("Unknown option: #{ARGV[0].inspect}")
else break
end; }
# Program carries on here.
puts("quiet: #{$quiet} logfile: #{$logfile.inspect} args: #{ARGV.inspect}")
发布于 2009-06-18 14:22:35
作为Trollop的作者,我无法相信人们认为期权解析器中的东西是合理的。我是认真的。它让人大吃一惊。
为什么我必须创建一个模块来扩展其他模块来解析选项?为什么我必须要继承任何东西呢?为什么我必须订阅一些“框架”来解析命令行?
以下是上述代码的Trollop版本:
opts = Trollop::options do
opt :quiet, "Use minimal output", :short => 'q'
opt :interactive, "Be interactive"
opt :filename, "File to process", :type => String
end
就是这样。opts
现在是具有键:quiet
、:interactive
和:filename
的散列。你可以用它做任何你想做的事情。你会得到一个漂亮的帮助页面,格式适合你的屏幕宽度,自动的短参数名称,类型检查……你需要的一切。
这是一个文件,所以如果您不想要正式的依赖项,可以将它放到lib/目录中。它具有最小的DSL,很容易上手。
每个选项人员的LOC。这很重要。
发布于 2009-05-23 03:35:42
我和你一样讨厌require 'getopts'
,主要是因为OptionParser
的强大之处
% cat temp.rb
require 'optparse'
OptionParser.new do |o|
o.on('-d') { |b| $quiet = b }
o.on('-i') { |b| $interactive = b }
o.on('-f FILENAME') { |filename| $filename = filename }
o.on('-h') { puts o; exit }
o.parse!
end
p :quiet => $quiet, :interactive => $interactive, :filename => $filename
% ruby temp.rb
{:interactive=>nil, :filename=>nil, :quiet=>nil}
% ruby temp.rb -h
Usage: temp [options]
-d
-i
-f FILENAME
-h
% ruby temp.rb -d
{:interactive=>nil, :filename=>nil, :quiet=>true}
% ruby temp.rb -i
{:interactive=>true, :filename=>nil, :quiet=>nil}
% ruby temp.rb -di
{:interactive=>true, :filename=>nil, :quiet=>true}
% ruby temp.rb -dif apelad
{:interactive=>true, :filename=>"apelad", :quiet=>true}
% ruby temp.rb -f apelad -i
{:interactive=>true, :filename=>"apelad", :quiet=>nil}
https://stackoverflow.com/questions/897630
复制相似问题