Я новый пользователь 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, не вызывая его явно?
Я собираюсь сделать предположение и предположить, что ваши файлы (разработанные в 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
Чтобы решить эту проблему, вы можете использовать #!/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, отличная от версии в строке хэш-бэнг.
BLOCKQUOTE>
Взятие различного предположения: Ваш сценарий имеет исполняемые полномочия?
ls -l
должен перечислить полномочия как rwxrwxr-x
для петляния как сценарий. Можно изменить полномочия в GUI (щелкните правой кнопкой по в †’ Свойства , и в зависимости от программы файлового менеджера, обычно что-то как , вкладка Permissions с установкой как Выполняется: в–Ў Позволяют выполнять файл как программу ), или от текстовой оболочки с chmod
; например, chmod u=rwx,g=rwx,o=rx my_script.pl
для установки "пользователя, владеющего файлом, может читать, записать и выполнить его; члены группы, владеющей им, могут сделать то же; другие могут считать или выполнить (но не запись) его"
Спасибо, все, я нашел рабочее решение.
Я использую только одну версию 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, сделав именно это.