2016-02-01 5 views
3

Я пытаюсь создать исходный код Apache OpenOffice в Cygwin в системе Windows 8.1. Сборки не может с этим сообщением:Что означает двоеточие, как вся первая строка?

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+"[email protected]"}' 
    if 0; 
#************************************************************** 
# 

Я хотел бы понять, что это значит. Даже хорошие поисковые запросы помогут.

+1

Не уверен, но есть упоминание 'eval' в http://perldoc.perl.org/perlrun.html – toolic

+0

Интересно. Это должно иметь какое-то отношение к специальной обработке Perl в первой строке. Однострочный текстовый файл с символом ':' выполняется без ошибок как Perl и ничего не делает, но если я вставляю пустую строку, поэтому ':' находится в строке 2, она умирает с синтаксической ошибкой. Но если он выполнен как сценарий оболочки, ': \ r' является синтаксической ошибкой, хотя': 'сам по себе не будет (оболочка не любит окончания строки в стиле Windows). Откуда берется «mkout.pl»? Можете ли вы преобразовать его для использования окончаний строк в стиле Unix? –

+0

'Можете ли вы преобразовать его для использования окончаний строк в стиле Unix?' Вы можете 'perl -i.bak -pe 'y | \ r || d' file_to_convert' –

ответ

7

проблема \r (CR, возвращение) знак.

линии:

eval 'exec perl -wS $0 ${1+"[email protected]"}' 
    if 0; 

указывают, что файл mkout.pl предназначен для исполнения в качестве сценария оболочки, используя хак, который вызывает сценарий повторного выполнения себя в качестве сценария Perl. Это часто встречается в системах, которые не поддерживают линии Unix-стиля #!, но это работает и с Unix-подобными системами.

: - это встроенная команда оболочки, которая ничего не делает.

Сообщение об ошибке указывает, что mkout.pl имеет окончание строк в стиле Windows. Оболочка (оболочка Cygwin по умолчанию - bash) не обрабатывает окончание строк в стиле Windows, поэтому, когда она видит строку, состоящую из символов ':', '\r' и '\n', она интерпретирует ее как команду ":\r", за которой следует новая строка. (Это не относится к символу '\r' как пробел.)

Модификации mkout.pl использовать окончания строк Unix-стиль должен решить непосредственную проблему - но если это часть дистрибутива исходного кода OpenOffice, там будет много другие файлы с той же проблемой. Если вы извлекли источники из файла .zip, обязательно разархивируйте его так, чтобы не конвертировать текстовые файлы.

(Вы можете просто установить OpenOffice или LibreOffice в Windows, но я полагаю, у вас есть веские причины, чтобы построить его из источника под Cygwin. Вполне возможно, что OpenOffice не поддерживает эту конкретную среду.)

После того, как вы получите В прошлом, все еще есть вопрос, что означает : в Perl. (В настоящее время интерпретатор Perl никогда не будет видеть ваш сценарий.)

На самом деле это описано в perldoc perlrun под -S вариант (курсив добавлен):

Этот пример работает на многих платформах, которые имеют оболочку, совместимый с Bourne оболочки:

#!/usr/bin/perl 
eval 'exec /usr/bin/perl -wS $0 ${1+"[email protected]"}' 
     if $running_under_some_shell; 

система игнорирует первую строку и передает программу/bin/с h, , который пытается выполнить программу Perl как скрипт оболочки. Оболочка выполняет вторую строку как обычную команду оболочки, и поэтому запускает интерпретатор Perl.В некоторых системах $0 не всегда содержит полное имя пути, поэтому -S сообщает, что Perl ищет программу , если это необходимо. После того, как Perl находит программу, он анализирует строки и игнорирует их, потому что переменная $running_under_some_shell никогда не является истинной. Если программа будет интерпретироваться с помощью csh, то вам нужно будет заменить ${1+"[email protected]"} на $*, хотя это не понимает встроенные пространства (и такие) в списке аргументов. Чтобы начать up sh, а не csh, некоторым системам, возможно, придется заменить строку «#!» с линией, содержащей только двоеточие, которое будет вежливо проигнорировано Perl. .

csh делает опознает команду :. Страница csh людей в моей системе не упоминает об этом, но странице tcsh людей делает:

: ничего не делает, успешно.

(В отличие от : встроенный в ш и Баш, : команда CSH в не принимает аргументов. Tcsh исправляет это.)

В любом случае, фиксируя концы строк должны решить вашу проблему ,

+0

Это похоже на хорошую теорию. Я сделаю несколько проверок на других исходных сценариях:: perl, чтобы узнать, имеют ли они окончательные строки в UNIX или Windows. Если mkout.pl является исключением, я могу его исправить. Если это часть шаблона, мне нужно найти другое решение. –

+0

Я полностью согласен с тем, что любой, кто хочет использовать OpenOffice, должен установить готовую версию, а не копировать то, что я делаю. Я строю из источника, потому что хочу попытаться помочь с проектом Apache OpenOffice, и, по крайней мере, одна проблема, которую я хочу рассмотреть, зависит от Windows. Я проверил файл с SVN, а не извлекал его из zip-файла, а версия, которую я имею, идентична версии в репозитории. –

+0

Как насчет вопроса в названии? Вы ответили, когда скрипт исполняется скриптом оболочки, но не тогда, когда он выполняется как скрипт Perl. (Я не знаю ответа. Я думал, что это какой-то пустой ярлык, но тогда было бы неважно, если бы вы разместили перевод строки перед ним.) – ikegami

Смежные вопросы