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
奇妙!只想要我想要的。那么问题是什么?
所有这些行为都记录在哪里?我想要做的是编写依赖于我发现在下一版本中被删除的一些古怪行为的代码。我想确保它是产品的一个完全支持的功能,而不是一些恰好起作用的奇数球副作用。
根据Stack Overflow(以及其他地方)的相关问题及其答案判断,该功能似乎鲜为人知。
有什么想法吗?
编辑:在@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,你会得到你应得的。 ; - )