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,你会得到你应得的。 😉