*[Ruby]「”%~d0%~p0ruby” -x ”%~f0” %*」の謎を追う。

irb.bat や gem.bat の最後に「"%~d0%~p0ruby" -x "%~f0" %*」という謎の文字列が入っている。

gem.bat の先頭の「@echo off」を「:: @echo off」のようにコメントアウトして実行すると、次のように出る。

G:¥>gem -v
G:¥>goto endofruby
G:¥>"G:¥rails¥InstantRails¥ruby¥bin¥ruby" -x "G:¥rails¥InstantRails¥ruby¥bin¥gem.bat" -v
0.9.2
G:¥>

つまり、
「"%~d0%~p0ruby" -x "%~f0" %*」は
「"G:¥rails¥InstantRails¥ruby¥bin¥ruby" -x "G:¥rails¥InstantRails¥ruby¥bin¥gem.bat" -v」に置き換わっていることが分かる。

これで、何をやっているのかは分かるのだが、「"%~d0」「%~p0」「%~f0」の説明が見たい。

「G:¥>hh C:¥WINDOWS¥Help¥ntcmds.chm::/ntcmds.htm」でヘルプが開く。「コマンド ライン リファレンス」→「バッチ ファイルを使用する」→「バッチ パラメータを使用する 」で次のような説明が出てきた。

バッチ パラメータ付きの修飾子を使用することもできます。
修飾子は、現在のドライブとディレクトリ情報を使って、
部分的または完全なファイル名やディレクトリ名としてバッチパラメータを展開します。
修飾子を使用するには、パーセント (%) 記号の後にチルダ (~) 記号を入力してから、
適切な修飾子を入力します (%~modifier)。
次の表は、展開できる修飾子の一覧です。
修飾子 説明
%~1 %1 を展開し、二重引用符 ("") がある場合は、これを削除します。
%~f1 %1 を完全修飾パス名に展開します。
%~d1 %1 をドライブ文字に展開します。
%~p1 %1 をパスに展開します。
%~n1 %1 をファイル名に展開します。
%~x1 %1 をファイル拡張子に展開します。
%~s1 展開されたパスにショート ネームだけを含めます。
%~a1 %1 をファイル属性に展開します。
%~t1 %1 をファイルの日付と時刻に展開します。
%~z1 %1 をファイル サイズに展開します。
%~$PATH:1 環境変数 PATH に指定されているディレクトリを検索し、%1 を、最初に見つかったファイルの完全修飾名に展開します。環境変数の名前が定義されていない場合、またはファイルが見つからない場合、この変数は空の文字列に展開されます。

あと、「ruby -x」の「-x」オプションも見慣れない。これは http://www.ruby-lang.org/ja/man/html/Ruby_A4CEB5AFC6B0.html#a.a5.b3.a5.de.a5.f3.a5.c9.a5.e9.a5.a4.a5.f3.a5.aa.a5.d7.a5.b7.a5.e7.a5.f3 に書いてあるとおり。

 -x[directory]
メッセージ中のスクリプトを取り出して実行します。
スクリプトを 読み込む時に、`#!'で始まり, "ruby"という文字列を含む行までを 読み飛ばします。
スクリプトの終りはEOF(ファイル の終り), ^D(コントロールD), ^Z(コ ントロールZ)
または予約語__END__で指定されます。
ディレクトリ名を指定すると、スクリプト実行前に指定されたディレクトリに移動します。

で、謎は解けた。
gem.batにコメントを付加するなら次のようになる。

@echo off           ・・バッチファイルとして実行される。バッチファイルのメッセージを抑制する。
goto endofruby        ・・endofrubyラベルまで無条件で飛ぶ。
#!/bin/ruby          ・・ここから以下はRubyスクリプトとして実行される。
               ・・「-x」の説明の中の「`#!'で始まり, "ruby"という文字列を含む行」に該当する。
require 'rubygems'  
・・・Rubyスクリプト部分(省略)・・・
Gem::GemRunner.new.run(args) ・・ここまでRubyスクリプトの実体。gemを実行する。
__END__            ・・ここまでがRubyスクリプトで、以下はバッチファイルとして実行される。
               ・・「-x」の説明の中の「スクリプトの終りは・・予約語__END__で指定されます」。
:endofruby          ・・バッチファイルとしてのラベル
"%~d0%~p0ruby" -x "%~f0" %*  ・・gem.bat を Rubyスクリプトとして、Rubyの「-x」オプションつきで実行する。