4

我最近开始学习 cgi,并在 vbox 中设置了一个 Ubuntu 服务器。我编写的第一个程序是在 Python 中通过 ssh 使用 vim。然后我在我的 Windows 7 工作站上安装了 Eclipse 并创建了完全相同的 Perl 文件;只是一个简单的 hello world 交易。

我尝试运行它,我得到了 500,而同一目录 (/usr/lib/cgi-bin) 中的 Python 代码显示正常。沮丧的是,我检查并三重检查了权限,并且它以 #!/usr/bin/perl 开头。我还检查了 AddHandler 是否设置为 .pl。一切都设置得很好,一时兴起,我决定使用 vim 在服务器中编写与 Python 文件相同的完全相同的代码。

瞧,它奏效了。我比较了它们,以为我疯了,它们完全一样。那么,有什么关系呢?为什么在 Eclipse 上的 Windows 7 中创建的文件与使用 vim 在 Ubuntu 服务器中创建的文件不同?它们是否有不同的二进制标头或其他东西?这真的会影响我的开发环境。

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

阿帕奇错误日志:

[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

\r我认为当您在 Windows 中编写 Perl 脚本时,您的 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 可能安装在两个环境中的不同位置。
  • 环境可能有不同版本的 Perl。
  • 环境可能具有不同的操作系统。
  • 权限可能在其中一种环境中设置不正确。
  • ETC

但是,与其像这样疯狂地推测,为什么不检查错误日志以了解您实际遇到的错误?

于 2012-08-07T16:58:52.367 回答
0

不,它们只是文本文件。当然,可以通过使用system()或其他依赖于环境的类似服务来编写不可移植的程序。

于 2012-08-07T16:50:07.470 回答