对于ruby / webrick,我需要窗口来识别shebang(#!)表示法

时间:2008-10-27 20:54:26

标签: windows ruby exec fork shebang

(请耐心等待,我保证会进入shebang和windows。)

我有最简单的WEBRick服务器:

require 'webrick'
include WEBrick

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

不可能更简单。这个基本服务器确实接受http连接(firefox,internet exploder,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服务器根本不可能;红宝石没有分叉支持。由于无法分叉进程,cgi服务器必须一次一个地执行每个cgi脚本,忽略所有并发请求,而第一个请求完成。虽然这对某些人来说可能是可以接受的,但它对我的申请不起作用。尽管如此,我仍然对我最初的问题的答案非常感兴趣 - 让shebang在windows下工作。

4 个答案:

答案 0 :(得分:3)

我认为你想要的是将文件扩展名与Ruby相关联。我认为不可能在Windows上使用!#符号,但可以让Windows自动启动带有特定解释​​器的脚本(如第二个示例所示)。一步一步地讨论你想要做的是here.你特别希望标题为“为无关联文件类型创建文件关联”。我认为这将完成你想要做的事情。

答案 1 :(得分:2)

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

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

在文件顶部添加以下行:

if "1.9.1" == RUBY_VERSION
  require 'rbconfig'  #constants telling where Ruby runs from
end

现在,找到最后一行所在的位置: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 ---

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

说明: 这段代码只是构建一个变量'Ruby',其中包含完整路径 “ruby.exe”,和 (如果您在Windows上运行)它会传递附加参数 “c:\ ruby​​ \ bin \ ruby​​.exe”,给Kernel.exec()方法,让你的 脚本可以执行。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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