(请耐心等待,我保证这会影响到 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,所以 我可以在 c:/rubyCGI/test.cgi 中获得操作系统(windows)识别的 shebang 表示法,这样我就不必每次都明确告诉它要使用哪个解释器? 我可以将所有 .cgi 文件指定为与 ruby​​ 关联,但从长远来看,这将受到限制。

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

有帮助吗?

解决方案

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

其他提示

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

编辑文件:c: uby\lib uby\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​​.exe”路径的变量“ ruby​​”,并且(如果您在Windows上运行),它将传递其他参数“ C: Ruby bin bin ruby​​.exe”,到达kernel.exec()方法,以便可以执行您的脚本。

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top