【问题标题】:How to access original command-line argument string in Ruby?如何在 Ruby 中访问原始命令行参数字符串?
【发布时间】:2020-06-29 19:35:00
【问题描述】:

我正在尝试访问 Ruby 中的原始命令行参数字符串(即 - 不使用预拆分/分离的 ARGV 数组)。有谁知道如何做到这一点?例如:

$> ruby test.rb command "line" arguments

我希望能够判断 'line' 周围是否有引号:

"command \"line\" arguments"

有什么建议吗?提前致谢

【问题讨论】:

    标签: ruby command-line-arguments


    【解决方案1】:

    据我所知,ruby 并没有从您的命令行中删除那些双引号。 shell 使用它们将内容插入为字符串并将它们传递给 ruby​​。

    你可以像这样得到 ruby​​ 接收到的所有东西:

    cmd_line = "#{$0} #{ARGV.join( ' ' )}"
    

    为什么需要知道引号中的内容?您可以使用其他分隔符(例如“:”或“#”)吗?

    如果需要,可以通过转义将双引号传递给 ruby​​:

    $> ruby test.rb command "\"line\"" arguments
    

    在这种情况下,上述cmd_line 变量将收到以下字符串:

    test.rb comand "line" arguments
    

    【讨论】:

    • 我想这是我能做到的最接近了
    【解决方案2】:

    我认为这不太可能,据我所知,这一切都是由 shell 在传递给程序之前处理的。

    【讨论】:

      【解决方案3】:

      在 Unix 系统上,命令行 shell(Bash、csh 等)会自动将此类语法转换为参数字符串并将它们发送到 Ruby 可执行文件。例如, * 会自动扩展到目录中的每个文件。我怀疑有办法检测到这一点,我问你为什么要这样做。

      【讨论】:

        【解决方案4】:

        这应该会有所帮助:

        cmdline = ARGV.map{|x| x.index(/\s/) ? "\"#{x}\"":x}.join " "
        

        由于 shell 将引号内的单词组合成一个参数,我们需要检查每个参数中是否有空格,如果有,请在其周围加上引号。

        它仍然不会保留通配符 (*)、环境变量 ($VAR) 和其他 shell 在将其传递给脚本之前扩展的内容。

        为了能够在没有扩展的情况下按原样传递命令,您必须求助于通过 IO 传递它,例如 echo "ls *" | my_script.rb

        【讨论】:

          【解决方案5】:

          Ruby 有一个为此目的的特殊模块。

          http://ruby-doc.org/stdlib-1.9.3/libdoc/shellwords/rdoc/Shellwords.html

          你想要的只是:

          require 'shellwords'
          Shellwords.join ARGV[1..-1]
          

          :p

          【讨论】:

            猜你喜欢
            • 2018-04-14
            • 1970-01-01
            • 1970-01-01
            • 2022-01-19
            • 2014-07-24
            • 2013-07-16
            • 1970-01-01
            相关资源
            最近更新 更多