【问题标题】:Using Ruby optparse to process list of files使用 Ruby optparse 处理文件列表
【发布时间】:2015-03-23 17:26:44
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: ruby optparse


    【解决方案1】:

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

    --list=Desktop/tour/*
    

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

    另一方面,OptionParser 具有处理参数列表的能力:

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

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

    【讨论】:

    • 谢谢。在看到另一个答案中的解释后,我想我会坚持使用 ARGV。如果有人真的需要这个功能,这仍然是一个不错的答案。
    • optParser 不允许我用空格分隔文件名。只有逗号。是否可以在不使用逗号的情况下将所有文件名放入 opt 中?
    【解决方案2】:

    考虑您的脚本,但使用相反的选项调用:

    ./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

    做到这一点的唯一方法是坚持-i 选项始终位于最后,这样就没有其他选项了,在这种情况下,您最好完全取消该选项并按照您引用的答案进行操作。

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

    【讨论】:

      猜你喜欢
      • 2014-01-21
      • 1970-01-01
      • 1970-01-01
      • 2013-03-07
      • 1970-01-01
      • 2018-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多