对于ruby/webrick,我需要windows来识别shebang(#!)符号
(请容忍我,我保证这会到达shebang和windows。) 我有大约最简单的WEBRick服务器:对于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),并适当地处理它们,只要我只是获取静态文档。但是,如果我将
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文件扩展名不够时,我已经做过几次了