Линия Shebang не вызывает Perl

Я новый пользователь Ubuntu, пытаюсь запустить сценарии, разработанные на Straberry Perl в Windows 7. Моя среда Unbutu - это Ubuntu 14.04 LTS и Perl 5.18.2.

Первая строка моих сценариев - #!/usr/bin/perl, которая должна вызывать интерпретатор perl в / usr / bin, и действительно, там живет объект размером 10,2 Кб. Тем не менее, мои сценарии не будут выполняться, если perl не является первым аргументом командной строки в Terminal, как в perl myscript.pl.

Есть ли способ, чтобы perl автоматически запускал сценарии .pl, не вызывая его явно?

7
задан 21 May 2015 в 13:38

4 ответа

Я собираюсь сделать предположение и предположить, что ваши файлы (разработанные в Windows) имеют формат DOS (CRLF).

Это будет мешать Шебангу, если не получится неясные сообщения:

$ ./my_script.pl
: No such file or directory

См. https://stackoverflow.com/questions/3569997/view-line-endings- in-a-text-file о том, как проверить окончания строк.

Например:

bash-4.1$ cat -v my_script.pl
#!/usr/bin/env perl^M
^M
print "Hello World\n";^M
^M

Тогда есть различные инструменты (например, dos2unix или fromdos), которые помогут вам преобразовать ваши текстовые файлы в правильное окончание строки Unix.

После преобразования:

$ cat -v my_script.pl
#!/usr/bin/env perl

print "Hello World\n";

И вы сможете их выполнить:

$ chmod 755 my_script.pl
$ ./my_script.pl
Hello World
0
ответ дан 21 May 2015 в 13:38

Чтобы решить эту проблему, вы можете использовать #!/usr/bin/env perl в качестве строки хеш-взрыва вместо #!/usr/bin/perl, чтобы bash использовал первый Perl, найденный в вашем PATH.

Цитируется по http://perlmaven.com/hashbang

Хотя мы использовали #! / Usr / bin / perl в качестве нашей строки хеш-бэна, могут быть и другие также. Например, если мы установили другую версию perl в другом месте и хотели бы, чтобы наши сценарии использовали это, тогда мы можем указать путь к этой версии perl. Например #! / Opt / perl-5.18.2 / bin / perl.

Преимущество установки хэш-взрыва (и включения исполняемого бита) состоит в том, что пользователю не нужно знать, что скрипт написан на Perl, и если в вашей системе несколько экземпляров Perl, строка хеш-взрыва может быть использованы, чтобы выбрать, какой Perl будет использоваться. Это будет одинаково для всех людей на конкретной машине. Недостатком является то, что perl, указанный в строке хэш-взрыва, используется только в том случае, если скрипт выполняется как ./hello.pl или как hello.pl. Если он выполняется как perl hello.pl, он будет использовать версию perl, найденную первой в каталогах, перечисленных в PATH. Это может быть версия Perl, отличная от версии в строке хэш-бэнг.

0
ответ дан 21 May 2015 в 13:38

Взятие различного предположения: Ваш сценарий имеет исполняемые полномочия?

ls -l должен перечислить полномочия как rwxrwxr-x для петляния как сценарий. Можно изменить полномочия в GUI (щелкните правой кнопкой по в †’ Свойства , и в зависимости от программы файлового менеджера, обычно что-то как , вкладка Permissions с установкой как Выполняется: в–Ў Позволяют выполнять файл как программу ), или от текстовой оболочки с chmod; например, chmod u=rwx,g=rwx,o=rx my_script.pl для установки "пользователя, владеющего файлом, может читать, записать и выполнить его; члены группы, владеющей им, могут сделать то же; другие могут считать или выполнить (но не запись) его"

0
ответ дан 21 May 2015 в 13:38

Спасибо, все, я нашел рабочее решение.

Я использую только одну версию Perl. Я использую стандартную установку Perl в стандартной установке Ubuntu 14.04 LTS, с инструментами по умолчанию bash и gedit.

Используя пустой «myscript.pl» в строке cmd, я получил странные сообщения «нет такого файла», «команда не найдена» или «невозможно выполнить двоичный файл ...».

Используя chmod u = x, я изменил бит x. Скрипт все еще не запускается.

Затем, используя gedit, я сохранил файл UTF-8 с Unix LF вместо DOS CR / LF. Все равно не побежит.

Затем, используя «./myscript.pl», бинго! в конце концов он работает с! # / usr / bin / perl.

Вывод: пользователям Linux, приходящим из Windows, необходимо изучить Unix ...

Мой сценарий теперь работает как в Linux, так и в Windows и правильно печатает и сортирует имена и сообщения с акцентированными символами при условии, что он сохранен в правильном формате по умолчанию, UTF-8 с Unix LF для Linux или ISO-8849-1 или ANSI с CR / LF для Windows .

Если кто-то хотел бы получить больше информации, я могу опубликовать тестовую версию barebone, сделав именно это.

0
ответ дан 21 May 2015 в 13:38

Другие вопросы по тегам:

Похожие вопросы: