小松です。

In message of [ruby-list:15879] Re: cannot install ruby-gtk into FreeBSD 2.2.x
    on 1999/8/4 21:09:35 gotoken / math.sci.hokudai.ac.jp (GOTO Kentaro) wrote:
|>忘れてましたが、これはCOMMAND.COMあるいはCMD.EXEの機能なので
|>cygwinのbashでmswin32の./rubyを起動した場合のケースではUNIX
|>と同様の対処が必要です。
|>
|>すると、which.rbにもdosishの対策が必要かも。
|
|dosish対策ってよく分からないのです…セパレータを切り替えれば
|いいんでしょうか?? 勘違いしてたら教えて下さい。

PATH_SEPARATORのところはOKで「:」と「;」が切り替わりますが、
File::SEPARATORは「/」のままなので「\」も追加でチェックする
必要があります。

で、これだけじゃなくて、さらに拡張子をつけてチェックしなければ
ならないです。つまり、
    which.rb ruby
なら、NTの場合、
    ruby.exe, ruby.com, ruby.cmd, ruby.bat
をチェックする必要があります (dln.cのdln_find_1()参照)。

しかも、これがOSによって微妙にちがうと。

以下の手抜きなセパレータの対策だけだと、こんな感じになります。

C:\usr\local\bin>ruby which.rb ruby       # ×

C:\usr\local\bin>ruby which.rb ruby.exe   # ○
C:\USR\LOCAL\BIN/ruby.exe

C:\usr\local\bin>ruby which.rb ./ruby.exe # ○
./ruby.exe

C:\usr\local\bin>ruby which.rb .\ruby.exe # ○
.\ruby.exe

C:\usr\local\bin>

どこかで拡張子のリストか、検索ルーチンをエクスポートして
くれないかなあ。

そういうサポートがないとすると、File::PATH_SEPARATORが「;」
なら、多少の間違いは大目にみてもらって最大公約数的な拡張子の
リストを作ってそれをためすか、プラットフォームごとに拡張子の
リストを用意するぐらいしかないでしょうね。

もしかすると、test(?x, prog)でこのへんうまくやってくれるのかな?
そうなら、優先順位を無視すれば、たとえば、ruby.*を検索して
test(?x, prog)がOKかどうかみるとかですむ可能性があります。

--- which.rb.orig	Wed Aug  4 21:23:40 1999
+++ which.rb	Wed Aug  4 21:32:24 1999
@@ -4,2 +4,7 @@
   def which(target, all = false)
+    if File::PATH_SEPARATOR == ";"
+      addtional_separator = "\\\\"
+    else
+      addtional_separator = File::SEPARATOR
+    end
     path = ENV['PATH'].split(File::PATH_SEPARATOR)
@@ -8,3 +13,3 @@
     for prog in target
-      if (prog =~ File::SEPARATOR)
+      if (prog =~ File::SEPARATOR or prog =~ addtional_separator)
 	res.push prog if test(?x, prog) && test(?f, prog)

うっ、cygwinも考えなきゃいけないか。

File::PATH_SEPARATORが「:」ですが、拡張子なしのものと拡張子を
つけたもの両方をみる必要があったりします。

bash-2.02$ ./ruby.exe -e 'puts File::PATH_SEPARATOR'
:
bash-2.02$ ./ruby -ve 'puts RUBY_INTERPRETER'
ruby 1.3.6 (1999-07-28) [i586-cygwin]
./ruby
bash-2.02$ ./ruby.exe -ve 'puts RUBY_INTERPRETER'
ruby 1.3.6 (1999-07-28) [i586-cygwin]
./ruby.exe
bash-2.02$ ln -s ruby.exe r
bash-2.02$ ./r -ve 'puts RUBY_INTERPRETER'
ruby 1.3.6 (1999-07-28) [i586-cygwin]
./r
bash-2.02$ 

--
小松克行 / Katsuyuki Komatsu <komatsu / sarion.co.jp>