Ruby语言的龌龊之处 – ARGV自动展开

作者:半瓶墨水   链接:http://www.2maomao.com/blog/ruby-rubbish-dirts-argv/

前面关于Ruby/Rails语言的不爽系列有:
    Ruby语言的龌龊之处 – “抢床”问题
    Ruby 中文、Unicode处理上的问题一例
    Rails默认规则 – 单复数的别扭之处

所谓“爱之深,恨之切”,最近又发现一个不爽的地方:ARGV的自动展开

今天写了一个小程序,用来给文件批量重命名的,结果发现参数个数总是不对。

后来发现ruby会比较“智能”的把文件名称展开,比如我的那个文件叫做exren.rb,接受两个参数,我想把r开头的mp3文件统统改成以t开头的,这么用:

ruby exren.rb r*.mp3 t*.mp3

结果ARGV接受了许多个参数,都是展开的,比如“ruby砍人狂想曲.mp3”等等。

在Google上找了半天,有个哥们提到了这个问题:

John Kaurin wrote:
> ruby Test.rb -> []
> ruby Test.rb *.py -> ["*.py"]
> ruby Test.rb *.rb -> ["Test.rb", "a.rb", "b.rb", "c.rb"]
>
> The first two cases I expected, but for the third
> I expected ["*.rb"] rather than the expanded
> wildcard output.
This is correct because globbing is done by the shell not by Ruby. The
reason you get *.py on the second case is because you don't have any
.py file so globbing is not done.

下面回答说这种展开(globbing)不是Ruby干的,是系统的Shell干的。
在Win32下面,这说法绝错!

看看这段

argument中的字符串将变成内部常数ARGV的初始值。在有的环境中(Win32),标准shell不会展开通配符,这时Ruby解释器将自行展开通配符然后赋值给ARGV。此时,可使用的通配符有“*”、“?”、“[]”和“**/”(与Dir.glob不同,这里不能使用“{..}”)。在Win32环境中,若不想展开通配符的话,请使用单引号(‘)将参数括起来

这严重不符合一般Win32编程者的使用习惯! 估计,ruby想把自己在windows下做成脚本语言替代品才这么干的。

小聪明害死人! 现在如果我想要使用exren.rb来批量重命名,使用的时候都得这么用:

ruby exren.rb r’*’.mp3 t’*’.mp3

多么烂的设计!

有许多可以和其他常见的传参方式兼容的替换方案:
1. 如果你想要展开,ok,提供一个库,给个函数接受Dir.pwd把ARGV展开。
2. 在ruby.exe上面加个参数用来关闭这种ARGV展开也好啊。

标签: [tag]ruby[/tag]

3 条评论 发表在“Ruby语言的龌龊之处 – ARGV自动展开”上

  1. hwx说道:

    没试过,不知可否这样:
    ruby exren.rb ‘r*.mp3’ ‘t*.mp3’
    通常我发现传进来的参数不对的时候,就会这样试试。。。呵呵,如果可以的话告诉一声。

  2. pluskid说道:

    反倒觉得 Windows 的那个 cmd.exe 太龌龊了。:(

  3. Xorcerer说道:

    Windows那个cmd叫弱智。期待一睹powershell的风采,不过,现在暂时用着cygwin,有点别扭。
    尤其是用vi的时候。

留下回复