A linha Shebang não invoca perl

7

Sou um novo usuário do Ubuntu, tentando executar scripts desenvolvidos no Straberry Perl no Windows 7. Meu ambiente Unbutu é o Ubuntu 14.04 LTS e o Perl 5.18.2.

A primeira linha dos meus scripts é #!/usr/bin/perl , que deve invocar o interpretador perl em / usr / bin e, de fato, há um objeto de 10,2 Kb vivendo lá. No entanto, meus scripts não serão executados, a menos que 'perl' seja o primeiro argumento de linha de comando no Terminal, como em perl myscript.pl .

Existe uma maneira de fazer com que o perl execute automaticamente scripts .pl sem invocá-lo explicitamente?

    
por mlibrt 21.05.2015 / 12:31

4 respostas

10

Vou adivinhar e postular que seus arquivos (desenvolvidos no Windows) estão no formato DOS (CRLF).

Isso irá interferir com o shebang, falhando com mensagens não tão claras:

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

Veja o link sobre como verificar suas terminações de linha.

Por exemplo:

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

Depois, há ferramentas diferentes (por exemplo, dos2unix ou fromdos) que ajudarão você a converter seus arquivos de texto em finalização de linha Unix adequada.

Após a conversão:

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

print "Hello World\n";

E você poderá executá-los:

$ chmod 755 my_script.pl
$ ./my_script.pl
Hello World
    
por jsantander 21.05.2015 / 15:13
8

Para resolver isso, você pode usar #!/usr/bin/env perl como a linha hash-bang, em vez de #!/usr/bin/perl , para que o bash use o primeiro Perl encontrado em seu PATH.

Citado no link

  

Enquanto usamos #! / usr / bin / perl como nossa linha hash-bang, pode haver outros também. Por exemplo, se nós instalamos outra versão do perl em um local diferente e gostaríamos que nossos scripts usassem isso, então podemos colocar o caminho para aquela versão do perl. Por exemplo #! / Opt / perl-5.18.2 / bin / perl.

     

A vantagem de configurar um hash-bang (e ativar o executável   bit) é que o usuário não precisa saber que o script está escrito em Perl   e se você tem várias instâncias de Perl em seu sistema   A linha hash-bang pode ser usada para escolher qual perl deve ser usado. Isto será   o mesmo para todas as pessoas na máquina específica. A desvantagem é   que o perl listado na linha hash-bang é usado apenas se o script   é executado como ./hello.pl ou como hello.pl. Se for executado como perl   hello.pl ele usará a versão do perl que é encontrada primeiro no   diretórios listados no PATH. Qual pode ser uma versão diferente do perl   do da linha hash-bang.

    
por Maythux 21.05.2015 / 12:38
2

Com um palpite diferente: o seu script tem permissões executáveis?

ls -l deve listar permissões como rwxrwxr-x para executar o arquivo como um script. Você pode modificar as permissões em sua GUI (clique com o botão direito do mouse → Propriedades e, dependendo do seu programa gerenciador de arquivos, geralmente algo como uma guia Permissões com uma configuração como Execute: □ Permitir a execução do arquivo como um programa ) ou de um shell de texto com chmod ; por exemplo, chmod u=rwx,g=rwx,o=rx my_script.pl para definir "o usuário que possui o arquivo pode ler, gravar e executá-lo; os membros do grupo que o possuem podem fazer o mesmo; outros podem ler ou executar (mas não escrevê-lo)"

    
por BRFennPocock 21.05.2015 / 19:16
0

Obrigado a todos, encontrei uma solução de trabalho.

Eu uso apenas uma versão do perl. Eu uso uma instalação perl padrão em uma instalação padrão do Ubuntu 14.04 LTS, com ferramentas de padrão bash e gedit.

Usando o nu 'myscript.pl' na linha do cmd, recebi mensagens estranhas 'no such file', 'comando não encontrado' ou 'não é possível executar o arquivo binário ...'.

Usando chmod u = x, mudei o bit x. O script ainda não funciona.

Então, usando o gedit, salvei o arquivo UTF-8 com o Unix LF em vez do DOS CR / LF. Ainda não correria.

Depois, usando './myscript.pl', bingo! finalmente corre com! # / usr / bin / perl.

Conclusão: os usuários de Linux que vêm do Windows precisam aprender um pouco de Unix ...

Meu script agora roda no Linux e no Windows e imprime e classifica corretamente os nomes de arquivos e mensagens acentuados desde que sejam salvos no formato padrão correto, UTF-8 com Unix LF para Linux ou ISO-8849-1 ou ANSI com CR / LF para Windows .

Se alguém quiser ter mais informações, posso postar uma versão de teste barebone fazendo exatamente isso.

    
por mlibrt 24.05.2015 / 12:25