проблема \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 исправляет это.)
В любом случае, фиксируя концы строк должны решить вашу проблему ,
Не уверен, но есть упоминание 'eval' в http://perldoc.perl.org/perlrun.html – toolic
Интересно. Это должно иметь какое-то отношение к специальной обработке Perl в первой строке. Однострочный текстовый файл с символом ':' выполняется без ошибок как Perl и ничего не делает, но если я вставляю пустую строку, поэтому ':' находится в строке 2, она умирает с синтаксической ошибкой. Но если он выполнен как сценарий оболочки, ': \ r' является синтаксической ошибкой, хотя': 'сам по себе не будет (оболочка не любит окончания строки в стиле Windows). Откуда берется «mkout.pl»? Можете ли вы преобразовать его для использования окончаний строк в стиле Unix? –
'Можете ли вы преобразовать его для использования окончаний строк в стиле Unix?' Вы можете 'perl -i.bak -pe 'y | \ r || d' file_to_convert' –