ワイルドカード
大した話ではないんですが,少し悩んだのでメモです.
'**'のワイルドカードって便利ですよね.ところが,rubyでoptionsにそれを渡すと挙動がおかしくって.
誰が展開するか?
shellです.だからfishは'**/'を受け取ってくれますが,bashはダメです.では,rubyは?
二つの正しい方法
ruby hage.rb */hoge.
って書いたときは,fishがあらかじめ展開してくれます.
p ARGV[0]
p ARGV
> ruby bin/calc_site_ks.rb **/d_ein*.o*
"double_new_model/vol_098/d_ein_098.o22192"
["double_new_model/vol_098/d_ein_098.o22192", "double_new_model/vol_100/d_ein_100_0_24.o22179", "double_new_model/vol_100/d_ein_100_24_44.o22180", "double_new_model/vol_102/d_ein_102.o22194", "double_new_model/vol_104/d_ein_104.o22195"]
ruby hage.rb '*/hoge.'
って書くと展開しません.
> ruby bin/calc_site_ks.rb '**/d_ein*.o*'
"**/d_ein*.o*"
["**/d_ein*.o*"]
ですんで,このあとDir.glob(ARGV[0])とかで展開させます.
普通のcommandの使い方ではクオートで括らないんで,そのまま展開されます.その場合は,optionの順序とか大事ですね.optparseとかthorとかまで使うんやったら気をつけますが,普段使いのcommandでは少し注意が必要かも.
仕様
rubyの起動にはそこらの仕様も明記されています.曰く,
argument に指定した文字列は組み込み定数 Object::ARGV の初期値として設定されます。標準のシェルがワイルドカードを展開しない環境 (Win32)では、Ruby インタプリタが自前でワイルドカードを展開して Object::ARGV に設定します。この場合ワイルドカードとして `*', `?', `[]', `**/' が使用できます。Win32 環境で、ワイルドカード展開を抑止したい場合は引数をシングルクォート(') で括ります。
- source ~/git_hub/ruby_docs/chart_style_ruby/wild_card.org