From: Katsuyuki Komatsu Date: 1999-08-06T19:53:44+09:00 Subject: [ruby-dev:7552] Re: cannot install ruby-gtk into FreeBSD 2.2.x 小松です。 ruby-listから移行しました。 # File::ALT_SEPARATORありがとうございます。 # これを使ったwhich.rbの[ruby-list:15880]版との差分つけました。 In message of [ruby-list:15913] Re: cannot install ruby-gtk into FreeBSD 2.2.x on 1999/8/6 04:59:10 gotoken@math.sci.hokudai.ac.jp (GOTO Kentaro) wrote: |file.c:eaccess() をみたけど、よく分かりませんでした。という |のも djcpp とかの mode の扱いをしらないので。NTは別扱いのよ |うです。 mswin32では、ファイルが存在しなくても常にtest(?x, prog)が trueを返すみたいです。バグかな? # 下のmswin32 (NT)とmswin32 (98)の所を参照。 |>bash-2.02$ ln -s ruby.exe r |このとき、test(?x, "./r") の結果ってどうなるんでしょう?? cygwinではtrueでした。 ruby.exeがあるとき./rubyがtrueになるのがすごい。 |まぁ何にせよ、この手の実行可能性を調べるためのライブラリには |必要性を感じますので何とかしませんか?? Fileに追加ですかね? 実行ファイルかも知れない拡張子の優先順位付きのリストは必須として、 後は、なにがあればいいかな? # perlのFile::Spec::*とかExtUtils::MM_*とかは参考になるかも。 |とりあえずは、File::PATH_SEPARATOR でおおまかに切り分けて、 |拡張子の優先順序を分かってる範囲で列挙するということで。問題 |が出たら徐々に RUBY_PLATFORM とかで精度を上げていくという作 |戦でどうでしょ?? とりあえず、dln.cから抜き出してみました。 mswin32 (95, 98) COMMAND.COM: .com .exe .bat mswin32 (NT) CMD.EXE: .com .exe .bat .cmd ENV["PATHEXT"] (たとえば".COM;.EXE;.BAT;.CMD"になっている) にも設定されてますがどこまで信用できるかはよくわかりません。 os2_emx CMD.EXE?: .com .exe .bat .cmd djgpp ?: .btm .sh .ksh .pl .sed human ?: .r .x .bat == cygwin == bash-2.02$ cat x.rb while file = ARGV.shift print file, ": " p test(?x, file) end bash-2.02$ ls r* r range.o re.o ruby.exe rubycw.dll random.o rbconfig.rb regex.o ruby.o bash-2.02$ ./ruby -v ruby 1.3.6 (1999-07-28) [i586-cygwin] bash-2.02$ ./ruby x.rb ./r ./ruby ./ruby.exe ./ruby.com ./ruby.bat ./ruby.cmd ./r: true ./ruby: true ./ruby.exe: true ./ruby.com: false ./ruby.bat: false ./ruby.cmd: false bash-2.02$ touch ruby.bat bash-2.02$ ./ruby x.rb r ruby ruby.exe ruby.com ruby.bat ruby.cmd r: true ruby: true ruby.exe: true ruby.com: false ruby.bat: true ruby.cmd: false bash-2.02$ mv ruby.exe ruby.com bash-2.02$ ./r -v bash: ./r: No such file or directory bash-2.02$ ./ruby -v bash: ./ruby: No such file or directory bash-2.02$ ./ruby.com x.rb r ruby ruby.exe ruby.com ruby.bat ruby.cmd r: false ruby: false ruby.exe: false ruby.com: true ruby.bat: true ruby.cmd: false bash-2.02$ touch ruby.rb bash-2.02$ ./ruby.com x.rb ruby.rb ruby.rb: false bash-2.02$ cat > ruby.rb #! bash-2.02$ ./ruby.com x.rb ruby.rb ruby.rb: true bash-2.02$ mv ruby.com ruby.exe; rm ruby.bat ruby.rb bash-2.02$ == mswin32 (NT) == C:\TEMP>ver Windows NT Version 5.0 C:\TEMP>ruby -v ruby 1.3.6 (1999-07-28) [i386-mswin32] C:\TEMP>dir /b ruby* ruby.c ruby.obj ruby.exe C:\TEMP>ruby x.rb ruby ruby.c ruby.obj ruby.exe ruby.x ruby: true ruby.c: true ruby.obj: true ruby.exe: true ruby.x: true C:\TEMP> == mswin32 (98) == C:\TEMP>ver Windows 98 [Version 4.10.1998] C:\TEMP>dir /b ruby* ruby.c ruby.obj ruby.exe C:\TEMP>ruby x.rb ruby ruby.c ruby.obj ruby.exe ruby.x ruby: true ruby.c: true ruby.obj: true ruby.exe: true ruby.x: true C:\TEMP> --- which.rb-ruby-list-15880 Wed Aug 4 21:17:45 1999 +++ which.rb Fri Aug 6 18:59:45 1999 @@ -4,3 +4,3 @@ def which(target, all = false) - path = ENV['PATH'].split(File::PATH_SEPARATOR) + path = ENV['PATH'].split(File::PATH_SEPARATOR, -1).uniq @@ -8,3 +8,3 @@ for prog in target - if (prog =~ File::SEPARATOR) + if (prog =~ File::SEPARATOR or prog =~ Regexp.quote(File::ALT_SEPARATOR)) res.push prog if test(?x, prog) && test(?f, prog) @@ -12,2 +12,3 @@ for e in path + e = "." if e == "" cmd = e + File::SEPARATOR + prog -- 小松克行 / Katsuyuki Komatsu