对于ruby/webrick,我需要windows来识别shebang(#!)符号

对于ruby/webrick,我需要windows来识别shebang(#!)符号,windows,ruby,exec,fork,shebang,Windows,Ruby,Exec,Fork,Shebang,(请容忍我,我保证这会到达shebang和windows。) 我有大约最简单的WEBRick服务器: require 'webrick' include WEBrick s = HTTPServer.new(:Port=>2000, :DocumentRoot=>Dir::pwd) s.start 再简单不过了。这个基本的服务器确实接受http连接(firefox、InternetExploder、wget、TELENT),并适当地处理它们,只要我只是获取静态文档。但是,如果我将

(请容忍我,我保证这会到达shebang和windows。)

我有大约最简单的WEBRick服务器:

require 'webrick'
include WEBrick

s = HTTPServer.new(:Port=>2000, :DocumentRoot=>Dir::pwd)
s.start
再简单不过了。这个基本的服务器确实接受http连接(firefox、InternetExploder、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,因此我可以得到操作系统(windows)识别的c:/rubyCGI/test.cgi中的shebang符号,这样我就不必每次都明确告诉它使用哪个解释器了吗?我可以分配所有与ruby关联的.cgi文件,但从长远来看,这将是有限的

更新:
自从发布这篇文章后,我突然想到,从ruby运行cgi web服务器可能根本不可能;ruby没有分叉支持。由于没有分支进程的能力,cgi服务器必须一次一个地执行每个cgi脚本,在第一个cgi脚本完成时忽略所有并发请求。虽然这对一些人来说是可以接受的,但对我的申请来说是行不通的。尽管如此,对于我最初的问题,即让shebang在windows下工作,我仍然非常感兴趣。

我想你想要的是将文件扩展名与Ruby关联起来。我不认为有可能得到那个!#表示法在Windows上工作,但可以让Windows使用特定的解释器自动启动脚本(如第二个示例所示)。关于你想做什么的一个很好的逐步讨论是你特别想要标题为“为未关联的文件类型创建文件关联”的部分。我认为这将完成你想要做的事情

不是真的要争论。。。但是,当mongrel速度更快,并且使用windows编译本机时,为什么还要麻烦webrick呢?当然,这意味着不需要shebang。

一个通用的解决方案,它同时适用于Ruby 1.8.6.pxxx和1.9.1.p0 Windows操作系统如下所示:

编辑文件:c:\ruby\lib\ruby\1.9.1\webrick\httpservlet\cgi\u runner.rb

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.
在文件顶部添加以下行:

if "1.9.1" == RUBY_VERSION require 'rbconfig' #constants telling where Ruby runs from end 如果“1.9.1”==RUBY_版本 需要'rbconfig'#常量,告诉Ruby从何处运行 结束 现在,找到最后一行:exec ENV[“SCRIPT_FILENAME”] 注释该行并添加以下代码:

# --- from here --- if "1.9.1" == RUBY_VERSION #use RbConfig Ruby = File::join(RbConfig::CONFIG['bindir'], RbConfig::CONFIG['ruby_install_name']) Ruby << RbConfig::CONFIG['EXEEXT'] else # use ::Config Ruby = File::join(::Config::CONFIG['bindir'], ::Config::CONFIG['ruby_install_name']) Ruby << ::Config::CONFIG['EXEEXT'] end if /mswin|bccwin|mingw/ =~ RUBY_PLATFORM exec "#{Ruby}", ENV["SCRIPT_FILENAME"] else exec ENV["SCRIPT_FILENAME"] end # --- to here --- #---从这里--- 如果“1.9.1”==RUBY#u版本#使用RbConfig Ruby=File::join(RbConfig::CONFIG['bindir'], RbConfig::CONFIG['ruby\u install\u name'])
Ruby实际上,让Windows识别脚本文件中的shebang符号是可能的。它可以在相对较短的脚本中完成,比如Ruby或AutoIt。对于脚本文件的第一行,只需要一个相当简单的解析器,以及一些文件操作。当脚本文件的交叉兼容性是必需的,或者Windows文件扩展名不够时,我已经做过几次了