我正在尝试在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;
#**************************************************************
#
我想了解这意味着什么。即使是好的搜索条款也会有所帮助。
答案 0 :(得分:7)
问题是\r
(CR,返回)字符。
行:
eval 'exec perl -wS $0 ${1+"$@"}'
if 0;
表示文件mkout.pl
旨在作为shell脚本执行,使用导致脚本作为Perl脚本重新执行的hack。这在不支持Unix风格#!
行的系统上很常见,但它也适用于类Unix系统。
:
是一个内置的shell命令,不执行任何操作。
错误消息表明mkout.pl
具有Windows样式的行结尾。 shell(Cygwin的默认shell是bash)不处理Windows样式的行结尾,因此当它看到由字符':'
,'\r'
和'\n'
组成的行时,它会解释它作为命令":\r"
后跟换行符。 (它不会将'\r'
字符视为空格。)
修改mkout.pl
以使用Unix风格的行结尾应解决当前的问题 - 但如果它是OpenOffice源代码分发的一部分,那么会有大量其他文件出现同样的问题。如果您从.zip
文件中提取了源代码,请务必以不转换文本文件的方式解压缩它。
(您可以在Windows中安装OpenOffice或LibreOffice,但我认为您有充分的理由在Cygwin下从源代码构建它.OpenOffice可能不支持该特定环境。)
一旦你超越了它,仍然存在:
在Perl中意味着什么的问题。 (目前Perl解释器永远不会看到你的脚本。)
这实际上记录在perldoc perlrun
,-S
选项下(强调添加):
此示例适用于许多具有shell兼容性的平台 与Bourne 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
从来都不是真的。如果程序将由csh解释,你 需要将${1+"$@"}
替换为$*
,即使不是 理解参数列表中的嵌入空格(等)。 开始 某些系统可能必须替换“#!
”行,而不是csh 一行只包含一个冒号,将被礼貌地忽略 由Perl。
csh
确实识别:
命令。我系统上的csh
手册页没有提到它,但tcsh
手册页确实如此:
:
没有成功。
(与sh和bash中内置的:
不同,csh的:
命令不接受参数.tcsh纠正了这一点。)
在任何情况下,修复行结尾应该解决您的问题。