Meu palpite: ./check-dependencies.pl
começa com #!/usr/local/bin/perl
. Altere a primeira linha para #!/usr/bin/perl
.
Explicação: quando você executa um programa, o kernel carrega o arquivo na memória e o executa. No entanto, muitos executáveis (a maioria deles, na verdade) não podem ser executados diretamente, mas requerem outro programa, um carregador:
- A maioria dos programas binários é vinculada dinamicamente e deve ser carregada pelo vinculador dinâmico (
/lib/ld-linux.so.2
para 32 bits programas,/lib64/ld-linux-x86-64.so.2
para programas de 64 bits) que cuida do carregamento das bibliotecas solicitadas pelo programa. - Os scripts devem ser carregados pelo seu intérprete.
O kernel reconhece um script porque ele começa com uma linha shebang . Uma linha shebang é a primeira linha do script e consiste nos caracteres #!
seguidos pelo caminho completo para o interpretador. Opcionalmente, a linha também pode conter um espaço seguido por um argumento que é passado para o intérprete.
Por exemplo, se um script começar com #!/usr/local/bin/perl -w
, quando o kernel for instruído a executar esse script, ele executará /usr/local/bin/perl -w /path/to/script
. Se não puder executar /usr/local/bin/perl
, você receberá uma mensagem de erro. Como o kernel só pode reportar um código de erro e nenhuma informação adicional, a informação do kernel é idêntica se o script não existir ou se o interpretador não existir.
Alguns shells verificam a condição de erro nesse caso e imprimem uma mensagem diferente, como "intérprete incorreto" quando o script existe, mas o kernel informa "arquivo não encontrado". Mas o shell de script padrão no Ubuntu ( /bin/sh
) é o Dash, um shell que é projetado para executar scripts rapidamente e não possui recursos adicionais de conveniência como esse. Então você obtém o relatório simples "arquivo não encontrado".
Muitos scripts em Perl começam com #!/usr/local/bin/perl
, que é o caminho para o Perl na maioria das instalações não-Linux. Você pode achar útil criar isso em sua máquina - torne-o um link simbólico para /usr/bin/perl
e faça o mesmo com outros intérpretes enquanto estiver envolvido.
cd /usr/local/bin
ln -s ../../../bin/bash ../../bin/perl ../../bin/python ../../bin/ruby .
Ao escrever um script, você pode evitar esse problema escrevendo uma linha como #!/usr/bin/env perl
. Isso só pode ser feito se você não estiver passando argumentos para o intérprete. Veja Por que é melhor usar" #! / usr / bin / env NAME "em vez de" #! / path / to / NAME "como meu shebang? para uma discussão sobre essa possibilidade. / p>