如何在Ruby中访问原始命令行参数字符串?

时间:2010-06-03 14:26:53

标签: ruby command-line-arguments

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

$> ruby test.rb command "line" arguments

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

"command \"line\" arguments"

任何提示?提前致谢

5 个答案:

答案 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