我正在尝试访问 Ruby 中的原始命令行参数字符串(即 - 不使用预拆分/分离的 ARGV 数组)。有谁知道如何做到这一点?例如:
$> ruby test.rb command "line" arguments
我希望能够判断 'line' 周围是否有引号:
"command \"line\" arguments"
有小费吗?提前致谢
我正在尝试访问 Ruby 中的原始命令行参数字符串(即 - 不使用预拆分/分离的 ARGV 数组)。有谁知道如何做到这一点?例如:
$> ruby test.rb command "line" arguments
我希望能够判断 'line' 周围是否有引号:
"command \"line\" arguments"
有小费吗?提前致谢
据我所知,ruby 并没有从你的命令行中删除那些双引号。shell 使用它们将内容插入为字符串并将它们传递给 ruby。
您可以像这样获得 ruby 收到的所有内容:
cmd_line = "#{$0} #{ARGV.join( ' ' )}"
为什么您需要知道引号中的内容?您可以使用其他分隔符(例如“:”或“#”)吗?
如果需要,可以通过转义将双引号传递给 ruby:
$> ruby test.rb command "\"line\"" arguments
在这种情况下,上述cmd_line
变量将收到以下字符串:
test.rb comand "line" arguments
我认为这不太可能,据我所知,这一切都是由 shell 在传递给程序之前处理的。
在 Unix 系统上,命令行 shell(Bash、csh 等)自动将此类语法转换为参数字符串并将它们发送到 Ruby 可执行文件。例如, * 会自动扩展到目录中的每个文件。我怀疑有没有办法检测到这一点,我问你为什么要这样做。
这应该有助于:
cmdline = ARGV.map{|x| x.index(/\s/) ? "\"#{x}\"":x}.join " "
由于 shell 将引号内的单词组合成一个参数,因此我们需要检查每个参数中是否有空格,如果有,请在其周围加上引号。
它仍然不会保留通配符 (*)、环境变量 ($VAR) 和其他 shell 在将其传递给脚本之前扩展的内容。
为了能够在没有扩展的情况下按原样传递命令,您必须诉诸通过 IO 传递它,例如echo "ls *" | my_script.rb
为此,Ruby 有一个特殊的模块。
http://ruby-doc.org/stdlib-1.9.3/libdoc/shellwords/rdoc/Shellwords.html
你想要的只是:
require 'shellwords'
Shellwords.join ARGV[1..-1]
:p