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