4

私は最近cgiを学び始め、vboxでUbuntuサーバーをセットアップしました。私が最初に書いたプログラムは、vimからsshを使用したPythonでした。次に、Windows 7ステーションにEclipseをインストールし、まったく同じPerlファイルを作成しました。単純なHelloWorldの取引。

私はそれを実行しようとしましたが、同じディレクトリ(/ usr / lib / cgi-bin)のPythonコードが正常に表示されている間に、500を取得していました。イライラして、私はパーミッションをチェックしてトリプルチェックし、それが#!/ usr / bin/perlで始まっていることを確認しました。AddHandlerが.plに設定されているかどうかも確認しました。すべてがうまく設定され、気まぐれに、Pythonファイルで行ったのと同じようにvimを使用してサーバー内にまったく同じコードを書くことにしました。

見よ、それはうまくいった。私は怒ったと思ってそれらを比較しました、そしてそれらはまったく同じです。それで、取引は何ですか?Eclipse上のWindows7で作成されたファイルが、vimを使用してUbuntuサーバーで作成されたファイルと異なるのはなぜですか?それらは異なるバイナリヘッダーか何かを持っていますか?これは私の開発環境に本当に影響を与える可能性があります。

#!/usr/bin/perl
print "Content-type: text/html\n\n";
print "Testing.";

Apacheエラーログ:

[Tue Aug 07 12:32:02 2012] [error] [client 192.168.1.8] (2)No such file or directory:     exec of '/usr/lib/cgi-bin/test.pl' failed
[Tue Aug 07 12:32:02 2012] [error] [client 192.168.1.8] Premature end of script headers: test.pl
[Tue Aug 07 12:32:02 2012] [error] [client 192.168.1.8] File does not exist: /var/www/favicon.ico

これは私が得る継続的なエラーです。

4

3 に答える 3

12

\rWindowsで書くと、Perlスクリプトの最初の行に偽の文字がいくつかあると思います。

たとえば、Windowsで次のファイルを作成しました。

#!/usr/bin/perl

code goes here

hexdumpで表示すると、次のように表示されます。

00000000 23 21 2f 75 73 72 2f 62 69 6e 2f 70 65 72 6c 0d   |#!/ usr / bin/perl。|
00000010 0a 0d 0a 63 6f 64 65 20 67 6f 65 73 20 68 65 72|...コードは彼女に行きます|
00000020 65 0d 0a | e .. |
00000023

その中でマークアウトした0d-に注意してください。\rこれを使用して実行しようとすると、次の./test.plようになります。

zsh:./test.pl:不正なインタプリタ:/ usr / bin / perl ^ M:そのようなファイルまたはディレクトリはありません

一方、UNIXマシンのVimで同じコードを書くと、次のようになります。

00000000 23 21 2f 75 73 72 2f 62 69 6e 2f 70 65 72 6c 0a |#!/ usr / bin/perl。|
00000010 0a 63 6f 64 65 20 67 6f 65 73 20 68 65 72 65 0a|.codeはここにあります。|
00000020

これは、次のいずれかの方法で修正できます。

  1. おそらく、エディタに「UNIX行末」などを保存させることができます。
  2. dos2unix保存後、ファイルに対して実行または同様の操作を行うことができます
  3. sed:sed -e 's/\r//g'などを使用できます。

あなたのapacheログはこれを確認できるはずです(彼らがあなたの開発サーバーでログを少し上げない場合)。

于 2012-08-07T17:38:51.747 に答える
2

確かに、それはできます。

  • 一方の環境には、もう一方にはインストールされていないモジュールがインストールされている場合があります。
  • Perlは、2つの環境の異なる場所にインストールされる可能性があります。
  • 環境には異なるバージョンのPerlがあるかもしれません。
  • 環境によってオペレーティングシステムが異なる場合があります。
  • いずれかの環境で権限が正しく設定されていない可能性があります。

しかし、このように乱暴に推測するのではなく、実際にどのようなエラーが発生したかをエラーログで確認してみませんか?

于 2012-08-07T16:58:52.367 に答える
0

いいえ、それらは単なるテキストファイルです。もちろん、system()環境に依存する他の同様のサービスを使用することで、移植性のないプログラムを簡単に作成することは可能です。

于 2012-08-07T16:50:07.470 に答える