Por que não recebo nenhum erro de sintaxe ao executar meu script Python com Perl?

85

Acabei de escrever um código de teste em Python test.pye o estou iniciando da seguinte maneira:

perl test.py

Depois de um tempo, percebi meu erro. Eu digo "depois de um tempo", porque o código Python é realmente executado corretamente, como se fosse um interpretador Python!

Por que meu Perl está interpretando meu Python? test.pyse parece com isso:

#!/usr/bin/python

...Python code here...

Curiosamente, se eu fizer o oposto (isto é, chamar python something.pl), obtenho uma grande quantidade de erros de sintaxe.

Dacav
fonte
6
Acho que é por causa do #!no início do arquivo. Na verdade, se eu remover o estrondo, estou obtendo o comportamento esperado. Não é uma má ideia do ponto de vista da segurança, afinal?
Dacav
8
Não. O ponto do caminho shebang é especificar um intérprete. Se você não confia no código a ser executado, então não deveria executá-lo em primeiro lugar.
Sobrique
1
Não, na verdade não. Seu script é um arquivo de texto. Nem mais nem menos. Ele não 'funcionará' sem um intérprete.
Sobrique de
4
"Por que meu Perl está interpretando meu Python?" não é “um problema que não pode mais ser reproduzido ou um simples erro tipográfico”. Votado para reabrir. Os votos positivos no Q e no A mostram que esta é uma questão de interesse popular.
ikegami de
1
@ikegami Independentemente da popularidade, isso claramente não é "um simples erro tipográfico ... resolvido de uma maneira improvável de ajudar futuros leitores." Votado para reabrir.
ThisSuitIsBlackNot

Respostas:

114

De perlrun ,

Se a #!linha não contiver a palavra "perl" nem a palavra "indir", o programa com o nome de #!é executado em vez do interpretador Perl. Isso é um pouco bizarro, mas ajuda as pessoas em máquinas que não o fazem #!, porque elas podem dizer a um programa que seu SHELL é / usr / bin / perl , e o Perl então despacha o programa para o interpretador correto para eles.

Por exemplo,

$ cat a
#!/bin/cat
meow

$ perl a
#!/bin/cat
meow
ikegami
fonte
32
Uau. Fale sobre seus recursos obscuros. Uso Perl há mais de 20 anos e não fazia ideia de que era isso.
cjm
4
Comecei a usar Perl v4 no DOS, VMS e Solaris. São os recursos agnósticos / de conexão do SO como esse que tornaram a vida entre plataformas muito mais fácil.
tjd
1
@MarcvanLeeuwen Quando você escreve programas para Linux, OSX, VAX / VMS, Windows, Solaris, OS / 2 e qualquer outra coisa, a parte mais chata de portar um programa em linguagem de script é fazer com que ele seja iniciado, como muitos desses sistemas, embora geralmente compartilhar o recurso "digite um comando, faça com que seja encontrado e executado" em comum, faça quase todo o resto de maneira diferente. Este recurso do Perl torna o Perl uma ponte de lacunas fácil em funcionalidade - você pode escrever apenas um shebang no estilo Unix e se Perl estiver presente o código, seja código Perl ou não, sempre funcionará - é como um mais universal #! /usr/bin/env foo.
zxq9
1
@immibis Do thread Shebang line parsing mistério na lista de discussão perl5-porters: " indirera um programa projetado para executar outros programas indiretamente. Minha lembrança é que era para ser particularmente útil em situações setuid onde o sistema operacional não fornecia nativamente você ajuda muito, e / ou talvez em situações em que o kernel do sistema operacional o limita a linhas de comando de 32 caracteres. "
ThisSuitIsBlackNot
2
Isso apenas reforça a reputação do Perl como o redutor de linguagens de programação. Como uma observação interessante, acredito que a implementação original do shebang foi como um recurso de shell, apenas mudou para o kernel Unix mais tarde. Perl inclui muitos mecanismos de shell (por exemplo, crases para substituir a saída do comando), este é apenas mais um.
Barmar de