我正在尝试在Windows 8.1系统上的Cygwin中构建Apache OpenOffice源代码。构建失败,并显示以下消息:
Entering /cygdrive/c/OpenOfficeDev/Trunk/main/solenv
/cygdrive/c/OpenOfficeDev/Trunk/main/solenv/bin/mkout.pl: line 1: $':\r': command not found
mkout -- version: 1.8
mkout.pl的前几行是:
:
eval 'exec perl -wS $0 ${1+"$@"}'
if 0;
#**************************************************************
#
我想了解这意味着什么。即使是良好的搜索字词也会有所帮助。
问题是\r
(CR,Return)字符。
这些行:
eval 'exec perl -wS $0 ${1+"$@"}'
if 0;
表示该文件mkout.pl
旨在用作Shell脚本,并使用一种可导致脚本将自身重新执行为Perl脚本的黑客手段。这在不支持Unix样式的#!
行的系统上很常见,但是在类似Unix的系统上也可以使用。
该:
是一个内置的shell命令,什么也不做。
错误消息表明它mkout.pl
具有Windows样式的行尾。外壳(Cygwin的默认shell是bash)不处理Windows样式行尾,所以当它看到由字符的线条':'
,'\r'
以及'\n'
,它解释为一个命令,":\r"
后跟一个换行符。(它不会将'\r'
字符视为空格。)
修改mkout.pl
为使用Unix样式的行尾应该可以解决当前的问题-但是,如果它是OpenOffice源代码发行版的一部分,那么将会有很多其他文件出现同样的问题。如果从.zip
文件中提取源,请确保以不转换文本文件的方式将其解压缩。
(您可以只在Windows中安装OpenOffice或LibreOffice,但我认为您有充分的理由在Cygwin下从源代码进行构建。OpenOffice可能不支持该特定环境。)
一旦克服了这一点,仍然存在:
Perl中意味着什么的问题。(当前,Perl解释器永远看不到您的脚本。)
这实际上记录在中perldoc perlrun
的-S
选项下(添加了强调):
该示例可在具有与Bourne shell兼容的shell的许多平台上工作:
#!/usr/bin/perl
eval 'exec /usr/bin/perl -wS $0 ${1+"$@"}'
if $running_under_some_shell;
系统将忽略第一行,并将程序提供给/ bin / sh,然后继续尝试将Perl程序作为shell脚本执行。该Shell作为常规Shell命令执行第二行,从而启动Perl解释器。在某些系统
$0
上,并不总是包含完整的路径名,因此-S告诉Perl必要时搜索程序。Perl找到程序后,它将分析行并忽略它们,因为变量$running_under_some_shell
永远不会为true。如果程序将由csh解释,则即使不了解参数列表中的嵌入式空格(等),也需要将替换为“${1+"$@"}
”$*
。要启动sh而不是csh,某些系统可能必须替换“#!
”行与仅包含冒号的行,Perl会礼貌地忽略该行。
csh
可以识别:
命令。csh
我的系统上的手册页没有提及,但是tcsh
手册页却提到了:
:
什么也不做,成功。
(与:
sh和bash内置的:
命令不同,csh的命令不接受参数。tcsh对此进行了更正。)
无论如何,固定行尾应该可以解决您的问题。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句