整个第一行的冒号是什么意思?

时间:2016-02-01 20:37:43

标签: perl

我正在尝试在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;
#**************************************************************
#

我想了解这意味着什么。即使是好的搜索条款也会有所帮助。

1 个答案:

答案 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纠正了这一点。)

在任何情况下,修复行结尾应该解决您的问题。