Строка Shebang не вызывает perl

7

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

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

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

задан mlibrt 21.05.2015 в 10:31
источник

4 ответа

10

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

Это будет мешать работе shebang, не получив сообщения с нечеткими сообщениями:

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

См. Ссылка о том, как проверить окончание строки.

Например:

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
    
ответ дан jsantander 21.05.2015 в 13:13
источник
8

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

Цитата из Ссылка

  

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

     

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

    
ответ дан Maythux 21.05.2015 в 10:38
источник
2

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

ls -l должен отображать разрешения, такие как rwxrwxr-x , чтобы запустить файл как скрипт. Вы можете изменить разрешения в своем графическом интерфейсе (щелкните правой кнопкой мыши по Свойства , и в зависимости от вашей программы файлового менеджера, обычно что-то вроде вкладки Разрешения с настройкой типа Выполнить: □ Разрешить выполнение файла в виде программы ) или текстовой оболочки с chmod ; например, chmod u=rwx,g=rwx,o=rx my_script.pl , чтобы установить «пользователь, владеющий файлом, может читать, записывать и выполнять его, члены группы, владеющие им, могут делать то же самое, другие могут читать или выполнять (но не писать)«

    
ответ дан BRFennPocock 21.05.2015 в 17:16
источник
0

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

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

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

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

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

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

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

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

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

ответ дан mlibrt 24.05.2015 в 10:25
источник

Ознакомьтесь с другими вопросами по меткам