Windos版whichコマンド
[*nix `which` command on Windows (need Ruby). https://gist.github.com/ne-sachirou/5229362 ]
冒頭のcommentは、bat commandにてwhichを実装しようとした試みの死骸。
bat fileとして実行できる樣にした爲、環境變數のpathの通ったところに置けば、which targetname
にて実行できる。
補足: 此のfileがbat fileとして実行できる理由
@echo off ruby -x %f0 %* @goto end #!ruby # encoding=utf-8 # Write some Ruby codes here. :end
cmdのbat実行機は、全体を構文解析せずbat fileを一行づつ讀んでいく。その爲、途中にRubyのcodeが書いてあったとしても、それだけではbat fileの起動に失敗する事はない。
cmdはruby -x %~f0 %*
に突き当たる。%~f0
は、現在実行中のbat file自身のpath、即ち当which.bat自身のfull pathへ展開される。%*
は、当bat file自身に与えられた全てのcommand line optionへ展開される。例えばwhich python
とやった場合は、%*
はpython
へ展開される。此れ等が-x
optionと共にrubyへ渡される。
-x
optionを与えられて起動したrubyは、そのfileの先頭から探索を始め、shebang (#!~
) 行を見付ける迄読み飛ばす。即ち此の場合は、fileの先頭に書いてあったbat codeを無視できることになる。rubyはshebang (#!
) 以降のruby codeを実行し、終了する。file末尾の:end
は後述する、bat実行機を此所迄読み飛ばさせる為のlabelであるが、Rubyでは此れはただのsymbol literalと解釈されるので、害は無い。
rubyが終了したため、batの続きが実行される。@goto end
に依り、cmdは:end
labelの探索を行い、そこへ制御を飛ばす。探索のみが行われ構文の解析は起らない爲、Rubyのcodeが邪魔をする事は無い。:end
以降、file末尾に到達する爲、cmdは当bat fileの実行を終える。
特殊なlabel :eof
を使うこともできる。bat fileでは、goto :eof
とすれば、fileの末尾へ飛べる。この場合:
は必要である。
@echo off ruby -x %f0 %* @goto :eof #!ruby # encoding=utf-8 # Write some Ruby codes here.
又、Rubyの末尾を示す__END__
を使うこともできる。batの飛び先labelのその後ろに、bat codeを続けられる様に成る。
@echo off ruby -x %f0 %* @goto end #!ruby # encoding=utf-8 # Write some Ruby codes here. __END__ :end REM some bat codes here.
cf. [WindowsのバッチファイルにRubyを埋め込む - ayumin http://d.hatena.ne.jp/ayumuaizawa/20091220/1261327095 ]