使用Ruby optparse处理文件列表

时间:2015-03-23 17:26:45

标签: ruby optparse

是否可以使用Ruby的OptionParser处理文件列表,还是必须单独解析ARGV?

我正在尝试解析在Linux中运行的Ruby脚本的命令行参数。目前我的脚本使用如下样式调用:./run.rb /dir/*并解析ARGV以获取其操作的文件列表。但是,现在我有几个我要切换的操作,所以不是编辑脚本我想添加一个命令行选项。因此,该脚本将被调用为./run.rb -a action -i /dir/*

当我试图让这个工作时,我遇到的问题是只获取目录中的第一个文件。 “Parsing command-line arguments as wildcards”解释说原因是shell正在扩展文件列表,而当OptionParser处理数组时,它会查找逗号分隔值。答案还说:

  

因为*通配符被替换为空格分隔的文件名   在OptionParser运行后你必须对ARGV进行后处理   它,或以编程方式将目录全局化并构建列表   办法。 ARGV具有除-a选项中拾取的文件之外的所有文件   所以,就个人而言,我放弃-a选项,让ARGV包含所有   文件。

这是正确的,OptionParser没有办法处理shell扩展返回的空格分隔值吗?我没有找到任何东西,所以我认为我的解释是正确的。但我也认为这将是一个常用的功能,所以我很惊讶这种情况,因此这个问题的原因。

2 个答案:

答案 0 :(得分:2)

这取决于。当您像这样传递参数时,可以忽略文件扩展

--list=Desktop/tour/*

在这种情况下,您可以自己Dir.glob文件。

另一方面,OptionParser能够处理参数列表:

opts.on("--list x,y,z", Array, "Example 'list' of arguments") do |list|
  options[:list] = list
end

您可以将所有这些与其他答案结合起来,或者查看高级解析器,例如trollop

答案 1 :(得分:1)

考虑你的脚本,但是反过来调用选项:

./run.rb -i /dir/* -a action

假设/dir/包含两个文件foobar,这将由shell扩展为:

./run.rb -i /dir/bar /dir/foo -a action

脚本如何区分以下内容?

  1. 将两个文件指定为-i选项的值,并将-a选项指定为action作为值(预期的情况),并且

  2. 四个文件被指定为-i操作的值(/dir/bar/dir/foo与之前一样,加上-aaction

  3. 这样做的唯一方法就是坚持-i选项始终是最后一个,这样就没有其他选项了,在这种情况下,您可以完全取消该选项并执行您引用的答案建议。

    请记住shell执行通配符(和其他)扩展,然后在空格上拆分命令以创建字符串数组,并在脚本之前执行此操作,以便查看它问题更多的是关于shell而不是OptionParser(同样的问题会影响任何语言的任何选项解析库)。我想将一个文件列表作为选项传递给一个命令(而不是主输入)还不足以保证改变shell行为或添加一个以不同方式扩展的功能(at至少我不知道有任何这样的替代扩张。)