是否可以使用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扩展返回的空格分隔值吗?我没有找到任何东西,所以我认为我的解释是正确的。但我也认为这将是一个常用的功能,所以我很惊讶这种情况,因此这个问题的原因。
答案 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/
包含两个文件foo
和bar
,这将由shell扩展为:
./run.rb -i /dir/bar /dir/foo -a action
脚本如何区分以下内容?
将两个文件指定为-i
选项的值,并将-a
选项指定为action
作为值(预期的情况),并且
四个文件被指定为-i
操作的值(/dir/bar
和/dir/foo
与之前一样,加上-a
和action
)
这样做的唯一方法就是坚持-i
选项始终是最后一个,这样就没有其他选项了,在这种情况下,您可以完全取消该选项并执行您引用的答案建议。
请记住shell执行通配符(和其他)扩展,然后在空格上拆分命令以创建字符串数组,并在脚本之前执行此操作,以便查看它问题更多的是关于shell而不是OptionParser(同样的问题会影响任何语言的任何选项解析库)。我想将一个文件列表作为选项传递给一个命令(而不是主输入)还不足以保证改变shell行为或添加一个以不同方式扩展的功能(at至少我不知道有任何这样的替代扩张。)