なんでいまさら cmd.exe の仕様を調べねばならんのだ……。
公式仕様がみつかりません。
(05:25)
追記
そもそもなぜこんなことを調べているかというと、クックブックがきっかけです。 「Rubyスクリプトを名前だけで実行可能にする」という項目があって、 そこに mswin32 版 ruby が使ってる方法を書いてたんです。 そうしたら、ゆうぞうさんに「%0 ってないの?」とつっこまれて、 調べてるうちに深みにはまった。
調べた結果は次の通り。 cmd.exe にも %0 は存在して、実際最初は「"%0"」だった ([ruby-dev:18895] instruby.rb 1.32)。 しかし Ruby が複数インストールされている環境を考慮して絶対パスになった。 ([ruby-dev:19370] instruby.rb 1.40)。
(06:08)
UNIX プログラマ向けに Windows 世界の概要を説明してくれる本ってないですかねえ。 内容はこんな感じだといいなあ。
もちろん全部概要でいいんですけど。 入門よりもしっかりしていて、 ちゃんとプログラミングするんでもない、 その中間くらいが欲しい。
……というか、これはほとんど「俺が知りたいことリスト」 みたいなもんだな。
(06:40)
instruby.rb の変更ってこれですか。 タイムリーだなあ。
--- instruby.rb 23 Feb 2004 00:09:48 -0000 1.61 +++ instruby.rb 25 Feb 2004 12:16:14 -0000 1.62 @@ -74,6 +74,7 @@ end def with_destdir(dir) + return dir if $destdir.empty? dir = dir.sub(/\A\w:/, '') if File::PATH_SEPARATOR == ';' $destdir + dir end @@ -157,11 +158,11 @@ open(with_destdir(batfile), "w") { |b| b.print <<EOH, shebang, body, <<EOF @echo off -if "%OS%" == "Windows_NT" goto WinNT +if not "%~d0" == "~d0" goto WinNT #{ruby_bin_dosish} -x "#{batfile}" %1 %2 %3 %4 %5 %6 %7 %8 %9 goto endofruby :WinNT -#{ruby_bin_dosish} -x "#{batfile}" %* +"%~dp0#{ruby_install_name}" -x "%~f0" %* goto endofruby EOH __END__
なるほど。cmd.exe の変態記法をチェックして分岐するんですね。 まあ記法の変態さ加減では sh も負けてないか……。
えーと、%~f0 が %0 のフルパスで、%~dp0 が %0 の drive + dirname か。 利点は、prefix 以外にインストールされても rdoc が動く……でいいのかな。
(10:15)
Copyright (c) 2002-2007 青木峰郎 / Minero Aoki. All rights reserved.
でも、昨夜なかださんと相談して、またcmd.exeの時だけ挙動を変えちゃったりしたのでした。てへ。
あと、cmd.exeの仕様は、微妙なこと以外はWindowsのヘルプに普通に載ってます。
ぐお。本当だ。ありがとうございます。
MSDN ばっかり見てました……。