2

(ご容赦ください。これがシバンとウィンドウに到達することを約束します。)

私は、最も単純なWEBRickサーバーをまとめました。

require 'webrick'
include WEBrick

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

これ以上簡単なことはありません。この基本的なサーバーは、http 接続 (firefox、インターネット エクスプローダー、wget、TELENT) を受け入れ、静的ドキュメントをフェッチするだけであれば、それらを適切に処理します。ただし、ディレクトリ内のファイルの 1 つに .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 を変更することを妨げているので、OS (Windows) によって認識される c:/rubyCGI/test.cgi のシバン表記を取得できますか?使用する? すべての .cgi ファイルを ruby​​ に関連付けることができましたが、長期的には制限されます。

更新: これを投稿して以来、Ruby から CGI Web サーバーを実行することはまったくできないかもしれないと思いました。ruby は fork をサポートしていません。プロセスをフォークする機能がないため、cgi サーバーは各 cgi スクリプトを一度に 1 つずつ実行する必要があり、最初のリクエストが完了するまですべての同時リクエストを無視していました。これは一部の人には受け入れられるかもしれませんが、私のアプリケーションでは機能しません。とはいえ、最初の質問に対する答え、つまり窓の下でシバンを動かすという質問にはまだ非常に興味があります。

4

4 に答える 4

3

あなたが望むのは、ファイル拡張子をRubyに関連付けることだと思います。!# 表記を Windows で動作させることはできないと思いますが、Windows に特定のインタープリターを使用してスクリプトを自動的に起動させることは可能です (2 番目の例のように)。あなたがやりたいことの段階的な議論はここにあります。 具体的には、「関連付けられていないファイル タイプのファイル関連付けを作成するには」というセクションの見出しが必要です。それはあなたがやろうとしていることを達成すると思います。

于 2008-10-27T21:46:08.037 に答える
2

Windows 上の Ruby 1.8.6.pxxx と 1.9.1.p0 の両方で機能する一般的な解決策は次のとおりです。

ファイルを編集します: c:\ruby\lib\ruby\1.9.1\webrick\httpservlet\cgi_runner.rb

ファイルの先頭に次の行を追加します。

"1.9.1" == RUBY_VERSION の場合
  require 'rbconfig' #Ruby の実行元を示す定数
終わり

exec ENV["SCRIPT_FILENAME"] その行をコメントアウトして、次のコードを追加します。

#  - - ここから  - -
if "1.9.1" == RUBY_VERSION #use RbConfig
  Ruby = File::join(RbConfig::CONFIG['bindir'],
                        RbConfig::CONFIG['ruby_install_name'])
  Ruby << RbConfig::CONFIG['EXEEXT']
else # ::Config を使用
  Ruby = File::join(::Config::CONFIG['bindir'],
                        ::Config::CONFIG['ruby_install_name'])
  Ruby << ::Config::CONFIG['EXEEXT']
終わり

もし /mswin|bccwin|mingw/ =~ RUBY_PLATFORM
  exec "#{Ruby}", ENV["SCRIPT_FILENAME"]
そうしないと
  exec ENV["SCRIPT_FILENAME"]
終わり
# --- ここまで ---

ファイルを保存し、webrick サーバーを再起動します。

説明: このコードは、「ru​​by.exe」へのフル パスを持つ変数「Ruby」を作成するだけで、(Windows で実行している場合) 追加のパラメーター「c:\ruby\bin\ruby.exe」を渡します。 Kernel.exec() メソッドに追加して、スクリプトを実行できるようにします。

于 2009-05-28T08:49:01.750 に答える
0

本当に議論する必要はありません...しかし、雑種がはるかに高速で、ネイティブがWindowsでコンパイルされているのに、なぜwebrickを気にするのですか?そして、cozの場合、それはシバンが必要ないことを意味します。

于 2008-10-28T08:36:00.377 に答える
0

実際、Windows にスクリプト ファイルのシバン表記を認識させることは可能です。Ruby や AutoIt などの比較的短いスクリプトで実行できます。必要なのは、スクリプト ファイルの最初の行の単純なパーサーと、いくつかのファイル操作だけです。スクリプト ファイルの相互互換性が必要な場合、または Windows ファイル拡張子では不十分な場合に、これを数回実行しました。

于 2010-09-07T22:33:15.533 に答える