2

(请耐心等待,我保证这会到达 shebang 和 windows。)

我将最简单的 WEBRick 服务器放在一起:

require 'webrick'
include WEBrick

s = HTTPServer.new(:Port=>2000, :DocumentRoot=>Dir::pwd)
s.start

再简单不过了。这个基本服务器确实接受 http 连接(firefox、internetexplorer、wget、TELENT)并适当地处理它们,只要我只是获取静态文档。但是,如果我将目录中的一个文件设置为具有 .cgi 扩展名,我会在服务器终端上得到 500 和以下信息:

ERROR CGIHandler: c:/rubyCGI/test.cgi: 
C:/...[snip]...webrick/httpservlet/cgi_runner.rb:45: in 'exec': Exec format error - ...[snip]...

我在命令行上做了一些事情来模仿 cgi_runner.rb 第 45 行发生的事情

c:\>ruby
exec "c:/rubyCGI/test.cgi"
^Z
(same error erupts)

c:\>ruby
exec "ruby c:/rubyCGI/test.cgi"
^Z
Content-type: text/html

Mares eat oats and does eat oats and I'll be home for Christmas.

显然,WEBrick 尚未获准登陆 Windows。您通常对公司偏执的头痛使我无法修改 webrick,所以我可以在 c:/rubyCGI/test.cgi 中获得操作系统(windows)识别的 shebang 表示法,这样我就不必每次都明确告诉它要使用哪个解释器采用? 我可以将所有 .cgi 文件分配为与 ruby​​ 相关联,但从长远来看,这会受到限制。

更新:自从发布此内容后,我想到可能根本无法从 ruby​​ 运行 cgi Web 服务器;ruby 没有分叉支持。由于无法派生进程,cgi 服务器将不得不一次执行每个 cgi 脚本,在第一个完成时忽略所有并发请求。虽然这对某些人来说可能是可以接受的,但它不适用于我的应用程序。尽管如此,我仍然对我最初的问题的答案非常感兴趣——让 shebang 在 windows 下工作。

4

4 回答 4

3

我认为您想要的是将文件扩展名与 Ruby 相关联。我认为不可能让 !# 符号在 Windows 上工作,但可以让 Windows 自动启动带有特定解释​​器的脚本(如第二个示例中所示)。关于您想要做什么的逐步讨论在这里。 您特别想要标题为:“为未关联的文件类型创建文件关联”的部分。我认为这将完成你想要做的事情。

于 2008-10-27T21:46:08.037 回答
2

适用于 Windows 上的 Ruby 1.8.6.pxxx 和 1.9.1.p0 的通用解决方案如下:

编辑文件:c:\ruby\lib\ruby\1.9.1\webrick\httpservlet\cgi_runner.rb

在文件顶部添加以下行:

如果“1.9.1”== RUBY_VERSION
  require 'rbconfig' #constants 告诉 Ruby 从哪里运行
结尾

现在,找到最后一行: exec ENV["SCRIPT_FILENAME"] 注释掉该行并添加以下代码:

#  - - 从这里  - -
如果“1.9.1”== RUBY_VERSION #使用 RbConfig
  Ruby = File::join(RbConfig::CONFIG['bindir'],
                        RbConfig::CONFIG['ruby_install_name'])
  Ruby << RbConfig::CONFIG['EXEEXT']
其他 # 使用 ::Config
  Ruby = File::join(::Config::CONFIG['bindir'],
                        ::Config::CONFIG['ruby_install_name'])
  Ruby << ::Config::CONFIG['EXEEXT']
结尾

如果 /mswin|bccwin|mingw/ =~ RUBY_PLATFORM
  执行“#{Ruby}”,ENV[“SCRIPT_FILENAME”]
别的
  执行 ENV["SCRIPT_FILENAME"]
结尾
#  - - 到这里  - -

保存文件并重新启动 webrick 服务器。

说明:这段代码只是用“ruby.exe”的完整路径构建了一个变量“Ruby”,并且(如果你在Windows上运行)它传递了附加参数“c:\ruby\bin\ruby.exe”,到 Kernel.exec() 方法,以便您的脚本可以执行。

于 2009-05-28T08:49:01.750 回答
0

不是真的要争论......但是当 mongrel 速度更快并且使用 Windows 编译的本机编译时,为什么还要打扰 webrick?因为,这意味着不需要shebang。

于 2008-10-28T08:36:00.377 回答
0

实际上,可以让 Windows 识别脚本文件中的 shebang 表示法。它可以在相对较短的脚本中完成,比如 Ruby 或 AutoIt。脚本文件的第一行只需要一个相当简单的解析器,以及一些文件操作。当需要脚本文件的交叉兼容性或 Windows 文件扩展名不够用时,我已经这样做了几次。

于 2010-09-07T22:33:15.533 回答