首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Ruby中非常便宜的命令行选项解析

Ruby中非常便宜的命令行选项解析
EN

Stack Overflow用户
提问于 2009-05-22 12:35:30
回答 19查看 55.2K关注 0票数 116

编辑:请,请,在回复之前,请阅读这篇文章底部列出的两个要求。人们不断地发布他们的新的gem和库之类的东西,这显然不符合要求。

有时,我想非常便宜地将一些命令行选项编译到一个简单的脚本中。做这件事的一个有趣的方法是,不用处理getopts或解析或类似的事情:

代码语言:javascript
复制
...
$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.

  1. The代码足够小和简单,用户可以记住足够多的代码来直接输入完成此任务的代码,而不是从其他地方剪切和粘贴。想象一下这样一种情况:您在一个没有Internet访问的防火墙服务器的控制台上,您想要抛出一个快速脚本供客户端使用。我不知道你是怎么想的,但是(除了没有达到上面的要求)记住45行简化的微语法分析也不是我想做的事情。
EN

回答 19

Stack Overflow用户

回答已采纳

发布于 2009-06-19 10:47:40

以下是我通常使用的标准技术:

代码语言:javascript
复制
#!/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}")
票数 60
EN

Stack Overflow用户

发布于 2009-06-18 14:22:35

作为Trollop的作者,我无法相信人们认为期权解析器中的东西是合理的。我是认真的。它让人大吃一惊。

为什么我必须创建一个模块来扩展其他模块来解析选项?为什么我必须要继承任何东西呢?为什么我必须订阅一些“框架”来解析命令行?

以下是上述代码的Trollop版本:

代码语言:javascript
复制
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。这很重要。

票数 236
EN

Stack Overflow用户

发布于 2009-05-23 03:35:42

我和你一样讨厌require 'getopts',主要是因为OptionParser的强大之处

代码语言:javascript
复制
% 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}
票数 76
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/897630

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档