5

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

$> ruby test.rb command "line" arguments

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

"command \"line\" arguments"

有小费吗?提前致谢

4

5 回答 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
于 2010-06-03T14:44:02.117 回答
2

我认为这不太可能,据我所知,这一切都是由 shell 在传递给程序之前处理的。

于 2010-06-03T14:30:49.170 回答
2

在 Unix 系统上,命令行 shell(Bash、csh 等)自动将此类语法转换为参数字符串并将它们发送到 Ruby 可执行文件。例如, * 会自动扩展到目录中的每个文件。我怀疑有没有办法检测到这一点,我问你为什么要这样做。

于 2010-06-03T14:31:46.483 回答
0

这应该有助于:

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

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

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

为了能够在没有扩展的情况下按原样传递命令,您必须诉诸通过 IO 传递它,例如echo "ls *" | my_script.rb

于 2014-05-21T08:37:47.220 回答
0

为此,Ruby 有一个特殊的模块。

http://ruby-doc.org/stdlib-1.9.3/libdoc/shellwords/rdoc/Shellwords.html

你想要的只是:

require 'shellwords'
Shellwords.join ARGV[1..-1]

:p

于 2016-05-26T17:10:35.767 回答