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

5
我尝试在Ruby中访问原始的命令行参数字符串(即-不使用预先分离的ARGV数组)。 有人知道如何做到这一点吗?例如:
$> ruby test.rb command "line" arguments

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

"command \"line\" arguments"

任何建议?提前感谢。
5个回答

6
据我所知,Ruby并没有从您的命令行中删除这些双引号。Shell使用它们将内容作为字符串插值并将其传递给Ruby。
您可以按如下方式获取Ruby接收到的所有内容:
cmd_line = "#{$0} #{ARGV.join( ' ' )}"

你为什么需要知道引号中的内容?能否使用其他分隔符(如“:”或“#”)?

如果需要,你可以通过转义引号来将双引号传递给 Ruby:

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

上述的cmd_line变量将会在这种情况下接收到以下字符串:
test.rb comand "line" arguments

我猜这就是我能尽到的最接近的了。 - Bub Bradlee

2

据我所知,这似乎不太可能,因为在传递给程序之前,所有的处理都由 shell 完成。


2
在Unix系统中,命令行shell(如Bash、csh等)会自动将这种语法转换为参数字符串,并将它们发送到Ruby可执行文件。例如,“*”会自动扩展为目录中的每个文件。我怀疑是否有一种方法可以检测到这一点,并且我想知道您为什么要这样做。

0

0

这应该会有所帮助:

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

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

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

要能够按原样传递命令,而不进行扩展,您必须通过 IO 传递它,例如 echo "ls *" | my_script.rb


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接