【问题标题】:For ruby/webrick, I need windows to recognize shebang (#!) notation对于 ruby​​/webrick,我需要 windows 来识别 shebang (#!) 符号
【发布时间】:2010-09-19 11:20:47
【问题描述】:

(请耐心等待,我保证这会到达 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 下工作。

【问题讨论】:

    标签: windows ruby exec fork shebang


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        编辑文件: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

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

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

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            猜你喜欢
            • 2010-12-04
            • 2023-03-29
            • 2011-12-22
            • 2015-09-03
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多