¿Por qué no obtengo ningún error de sintaxis cuando ejecuto mi script de Python con Perl?

85

Acabo de escribir un código de prueba de Python test.pyy lo estoy lanzando de la siguiente manera:

perl test.py

Después de un tiempo me di cuenta de mi error. Digo "después de un rato", porque el código de Python se ejecuta correctamente, ¡como en un intérprete de Python!

¿Por qué mi Perl está interpretando mi Python? test.pySe ve como esto:

#!/usr/bin/python

...Python code here...

Curiosamente, si hago lo contrario (es decir, llamo python something.pl), obtengo una gran cantidad de errores de sintaxis.

Dacav
fuente
6
Supongo que se debe #!al principio del archivo. De hecho, si elimino el she-bang, obtengo el comportamiento esperado. ¿No es una mala idea desde la perspectiva de la seguridad, de todos modos?
Dacav
7
No. El punto de la ruta shebang es especificar un intérprete. Si no confía en que el código se ejecute, entonces no debería ejecutarlo en primer lugar.
Sobrique
1
No en realidad no. Su secuencia de comandos es un archivo de texto. Ni mas ni menos. No se "ejecutará" sin un intérprete.
Sobrique
4
"¿Por qué mi Perl está interpretando mi Python?" no es "un problema que ya no se puede reproducir o un simple error tipográfico". Votó para reabrir. Los votos a favor de la Q y la A muestran que esta es una cuestión de interés popular.
ikegami
1
@ikegami Independientemente de la popularidad, esto claramente no es "un simple error tipográfico ... resuelto de una manera poco probable que ayude a futuros lectores". Votó para reabrir.
ThisSuitIsBlackNot

Respuestas:

114

De perlrun ,

Si la #!línea no contiene la palabra "perl" ni la palabra "indir", #!se ejecuta el programa con el nombre de en lugar del intérprete de Perl. Esto es un poco extraño, pero ayuda a las personas en máquinas que no lo hacen #!, porque pueden decirle a un programa que su SHELL es / usr / bin / perl , y Perl luego enviará el programa al intérprete correcto para ellos.

Por ejemplo,

$ cat a
#!/bin/cat
meow

$ perl a
#!/bin/cat
meow
ikegami
fuente
32
Guau. Habla sobre tus características oscuras. He estado usando Perl durante más de 20 años y no tenía idea de que lo hiciera.
cjm
4
Empecé a usar Perl v4 en DOS, VMS y Solaris. Son características de puenteo / independientes del sistema operativo como esta las que facilitaron mucho la vida entre plataformas.
tjd
1
@MarcvanLeeuwen Cuando escribe programas para Linux, OSX, VAX / VMS, Windows, Solaris, OS / 2 y cualquier otra cosa, la parte más molesta de portar un programa en lenguaje de script es iniciarlo, ya que muchos de estos sistemas, aunque generalmente compartiendo la función "escribir un comando, encontrarlo y ejecutarlo" en común, hacer casi todo lo demás de manera diferente. Esta característica de Perl hace que Perl sea un puente de brechas en la funcionalidad: puede escribir solo un shebang al estilo Unix y si Perl está presente, el código, ya sea de Perl o no, siempre funcionará, es como una versión más universal #! /usr/bin/env foo.
zxq9
1
@immibis Del hilo Shebang line parsing mystery en la lista de correo de perl5-porters: " indirera un programa diseñado para ejecutar indirectamente otros programas. Mi recuerdo es que se suponía que era particularmente útil en situaciones setuid donde el sistema operativo no proporcionaba de forma nativa te ayuda mucho, y / o quizás en situaciones en las que el kernel del SO te limita a líneas de comando de 32 caracteres ".
ThisSuitIsBlackNot
2
Esto solo consolida la reputación de Perl como el fregadero de los lenguajes de programación. Como observación interesante, creo que la implementación original de shebang fue como una característica de shell, solo se trasladó al kernel de Unix más tarde. Perl incluye muchos mecanismos de shell (por ejemplo, comillas inversas para sustituir la salida del comando), este es solo uno más.
Barmar