Qual é a diferença entre invocar um script perl via sh ou perl?

7

Eu tenho um simples script perl do Hello World.

#!/usr/bin/perl

print 'Hello world.';

Funciona bem se eu o executar por meio de perl <file_name> , mas ele falhar, eu o executo via sh <file_name> .

Meu entendimento da primeira linha é que ela invoca o shell perl (semelhante a #! / usr / bin / bash invocará um shell bash). Então, qual é exatamente a diferença entre os dois comandos?

Encontrei este link que indica sh <file_name> "Nesse caso, você não executa o Perl em tudo, mas o shell, que vai chamar o programa 'imprimir'. " Se esse for o caso, é o #! apenas sendo interpretado como um comentário. Se sim, é necessário?

(estou ciente de que posso chmod + x o arquivo e executá-lo dirrectly, mas eu só quero saber a diferença entre os dois métodos que eu estava usando)

    
por Dave 01.05.2014 / 22:42

3 respostas

6

Se você executar um arquivo diretamente

/path/to/script/filename

A linha shebang será pesquisada pelo intérprete para executá-la. Se você executar perl ou sh com um argumento, eles se comportarão conforme documentado: tente interpretar o arquivo como um script em Perl ou shell, respectivamente.

Quando você define explicitamente o interpretador a partir da linha de comando (como sh foo.pl ou perl foo.pl ), a linha shebang não é usada para determinar o interpretador a ser executado. é analisado para possíveis opções, (por exemplo, com #!/usr/bin/perl -w shebang, executando o script como perl foo.pl ativará o -w flag), mas não é usado para determinar qual programa deve interpretar o script.

Portanto, executar um script perl como sh foo.pl significa que seu sistema tentará interpretá-lo como um script sh , apesar da linha perl shebang.

    
por 01.05.2014 / 23:04
1

Então você não tornou o script executável? sh não vai assumir automaticamente que as coisas com essas extensões de arquivo são executáveis, então você precisa executar perl <file name> ou você precisa torná-lo executável com chmod +x

    
por 01.05.2014 / 23:00
0

Os dois podem não ser os mesmos dependendo de como o Perl está instalado no sistema que você está usando. Tente digitar este comando:

which perl

Ele mostrará o caminho para o arquivo executável chamado "perl" no seu $PATH (tipo echo $PATH para ver seu $PATH ). Em muitos sistemas, isso será /usr/bin/perl , que é onde o Perl é normalmente instalado - é por isso que a linha "shebang" no início da maioria dos scripts Perl também assume que está lá.

Em alguns sistemas, no entanto, o caminho para perl pode ser diferente. Nesse caso, você pode obter um resultado diferente digitando perl your_script.pl versus usando o shell para interpretar a linha shebang, por ex. %código%; no primeiro caso, o interpretador ./your_script.pl no seu perl interpretará seu script, enquanto no último caso, o que estiver em $PATH será. Estes podem não ser os mesmos.

Em muitos casos, /usr/bin/perl é sua própria instalação do Perl, provavelmente mais recente que a que veio com o sistema (em perl ). Em outras palavras, há mais de um interpretador Perl no sistema. Nesse caso, é melhor você descobrir qual deles você quer e codificar seu caminho na sua linha shebang para que seu script não seja interpretado acidentalmente com a versão incorreta do Perl. (Você também pode escrever coisas como /usr/bin em seu script para segurança adicional a esse respeito.) Para verificar a versão do interpretador Perl, digite use 5.12; .

    
por 02.05.2014 / 04:53