Ruby Windows命令行通配

Ruby使用Windows上的命令行做了一个巧妙的窍门 – 它自己做了一个globbing(文件名扩展)。 这是因为cmd.exe和Powershell(编辑 – 错误,见下文)都像UNIX shell(bash,korn等)一样。

我一直在浏览源代码win32\win32.c ,我发现它用引号做了一些神奇的事情。 Windows cmd.exe只能识别双引号,但Ruby也会去掉单引号。

假设我正在为Windows编写一个简单的grep 。 我想传递一个RE作为第一个参数,然后是一个文件列表:

 pattern = ARGV.shift puts pattern puts ARGV 

以下是一些命令行实验:

 C:\>grep.rb u* u* utf8file.txt utf8file.txt C:\>grep.rb "u*" u* utf8file.txt utf8file.txt C:\>grep.rb 'u*' u* u* utf8file.txt 

精彩! 只是想要我想要的。 所以有什么问题?

所有这些行为在哪里logging? 我不想做的是编写代码,这取决于我在下一个版本中发现的一些古怪的行为。 我想确保它是一个完全支持该产品的function,而不是偶然发生的一些奇怪的副作用。

从堆栈溢出(以及其他地方)的相关问题及其答案来看,这个特性似乎并不为人所知。

有任何想法吗?

编辑:@Patru下面的评论我在Powershell上试过了:

 PS C:\> ruby grep.rb 'u*' u* utf8file.txt utf8file.txt PS C:\> ruby grep.rb "u*" u* utf8file.txt utf8file.txt PS C:\> ruby grep.rb ''u*'' u* utf8file.txt utf8file.txt PS C:\> ruby grep.rb `'u*`' u* u* utf8file.txt 

最后一个破解它。 用反引号“逃避”单引号。 你可以说,如果你使用Powershell,你会得到你应得的。 😉