如何将字符串“*.*”作为命令行参数传递给Ruby?

8

代码:

  #test_argv.rb
  puts "length: #{ARGV.length} "
  ARGV.each do |a|
    puts "Argument: #{a}"
  end

如果我在调用上述函数时提供字符串"*.*"(带引号或不带引号),则会得到以下输出结果:
  C:\test>test_argv *.*
  length: 5
  Argument: afile.TXT
  Argument: bfile.TXT
  Argument: cfile.TXT
  Argument: dfile.TXT
  Argument: somethingelse.TXT

即列出 c:\test 目录中的文件。

其他值,如 "s*.*",返回 somethingelse.TXT,如果您正在执行文件操作,则会按预期返回结果,但我不是。

但这个行为与我的预期相同:

  C:\test>test_argv asdf
  length: 1
  Argument: asdf

我的问题是,我该如何编写一个用户友好的脚本,使其可以将 "*.*"(等等)作为命令行参数?此外,这个问题在哪里有详细记录和解释?
编辑:这个问题出现在Windows和Linux上,涉及1.8.7和1.9.2版本。

Windows的解决方案是使用单引号,例如:' * . * '。 - davej
"Linux的解决方案就是像tadman发布的那样,用单引号或双引号包裹起来。" - davej
1个回答

6

你可能需要将此放入引号中:

test_argv "*.*"

引号应该避免让命令行参数过早地展开。


3
OP 观察到的行为是由 shell 执行的 "globbing" (通配符扩展) 导致的。 - Abe Voelker
1
进一步解释,问题在于您的 shell 解释了通配符序列并将其扩展为文件名列表,然后再传递给 Ruby。您的脚本实际上无法对此做任何事情,避免这种行为的唯一方法是在 shell 中转义特殊字符(执行此操作的语法可能因 shell 而异)。 - bta
正如我在帖子中所述,使用引号或不使用引号的行为是相同的。试一下吧。另外,对于SO的人们,在发布时存在一个错误:我发布了“如果我提供字符串”后跟引号、星号、点、星号、引号,但是两个星号没有出现;它们仍然存在,因为如果我编辑我的帖子,我可以看到它们。 - davej
我的错:在Linux中,由于引号的作用,它按预期工作,但在Windows中不行,即Windows会忽略引号并进行“globbing”。 - davej
1
@davej - 我已经解决了你在SO中表示字符串的问题。你需要用斜杠进行转义,即 "\."。 - Dominik Grabiec

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