【问题标题】: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