我最近学习了cgi,并在vbox中设置了一个Ubuntu服务器。我写的第一个程序是使用vim通过ssh在Python中编写的。然后我在我的Windows 7工作站上安装了Eclipse并创建了完全相同的Perl文件;只是一个简单的问候世界。
我试过运行它,我得到了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.";
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
这是我得到的持续错误。
答案 0 :(得分:12)
我认为在Windows中编写它时,Perl脚本的第一行会有一些虚假的\r
字符。
例如,我在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 |...code goes her| 00000020 65 0d 0a |e..| 00000023
请注意我已在其中标出的0d
- \r
。如果我尝试使用./test.pl
运行它,我会得到:
zsh: ./test.pl: bad interpreter: /usr/bin/perl^M: no such file or directory
然而,如果我在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 goes here.| 00000020
您可以通过以下几种方式解决此问题:
dos2unix
或类似内容sed -e 's/\r//g'
或类似内容。您的apache日志应该能够确认这一点(如果他们没有在开发服务器上稍微提高日志记录)。
答案 1 :(得分:2)
当然可以。
但是,为什么不检查错误日志中实际得到的错误,而不是像这样疯狂地猜测?
答案 2 :(得分:0)
不,它们只是文本文件。当然,通过使用system()
或其他依赖于环境的类似服务,可以编写不可移植的程序。