0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

ruby でwild card(**)を指定したときの挙動

Last updated at Posted at 2020-09-03

ワイルドカード

大した話ではないんですが,少し悩んだのでメモです.

'**'のワイルドカードって便利ですよね.ところが,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
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?