(请耐心等待,我保证会进入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下工作。
答案 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文件扩展名不够时,我已经做了几次。