c4se記:さっちゃんですよ☆

.。oO(さっちゃんですよヾ(〃l _ l)ノ゙☆)

.。oO(此のblogは、主に音樂考察Programming に分類されますよ。ヾ(〃l _ l)ノ゙♬♪♡)

音樂は SoundCloud に公開中です。

考察は現在は主に Scrapbox で公表中です。

Programming は GitHub で開發中です。

Windos版whichコマンド (*nix `which` command on Windows (need Ruby).)

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を無視できることになる。rubyshebang (#!) 以降の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 ]