Perché non ricevo errori di sintassi quando eseguo il mio script Python con Perl?


85

Ho appena scritto un po 'di test del codice Python test.pye lo sto avviando come segue:

perl test.py

Dopo un po 'ho capito il mio errore. Dico "dopo un po '", perché il codice Python viene effettivamente eseguito correttamente, come se fosse nell'interprete Python!

Perché il mio Perl interpreta il mio Python? test.pySomiglia a questo:

#!/usr/bin/python

...Python code here...

È interessante notare che se faccio il contrario (cioè chiamata python something.pl) ottengo una buona quantità di errori di sintassi.


6
Immagino sia a causa #!dell'inizio del file. In effetti, se rimuovo lo she-bang, ottengo il comportamento previsto. Non è comunque una cattiva idea dal punto di vista della sicurezza?
Dacav

8
No. Il punto del percorso shebang serve a specificare un interprete. Se non ti fidi del codice per l'esecuzione, non dovresti eseguirlo in primo luogo.
Sobrique

1
No, non proprio. Il tuo script è un file di testo. Ne più ne meno. Non "funzionerà" senza un interprete.
Sobrique

4
"Perché il mio Perl interpreta il mio Python?" non è "un problema non più riproducibile o un semplice errore tipografico". Votato per riaprire. I voti positivi sullo spettacolo Q e A questa è una questione di interesse popolare.
ikegami

1
@ikegami Indipendentemente dalla popolarità, questo chiaramente non è "un semplice errore tipografico ... risolto in un modo improbabile che possa aiutare i lettori futuri". Votato per riaprire.
ThisSuitIsBlackNot

Risposte:


114

Da perlrun ,

Se la #!riga non contiene la parola "perl" né la parola "indir", il programma chiamato dopo #!viene eseguito al posto dell'interprete Perl. Questo è un po 'bizzarro, ma aiuta le persone su macchine che non lo fanno #!, perché possono dire a un programma che il loro SHELL è / usr / bin / perl , e Perl invierà il programma all'interprete corretto per loro.

Per esempio,

$ cat a
#!/bin/cat
meow

$ perl a
#!/bin/cat
meow

32
Wow. Parla delle tue caratteristiche oscure. Uso Perl da più di 20 anni e non avevo idea che lo facesse.
cjm

4
Ho iniziato a usare Perl v4 su DOS, VMS e Solaris. Sono le funzionalità agnostiche / bridge del sistema operativo come questa che hanno reso la vita multipiattaforma molto più semplice.
giovedì

1
@ MarcvanLeeuwen Quando scrivi programmi per Linux, OSX, VAX / VMS, Windows, Solaris, OS / 2 e qualsiasi altra cosa, la parte più fastidiosa del porting di un programma in linguaggio di script è avviarlo, come molti di questi sistemi, sebbene di solito condividendo la funzione "digita un comando, fallo trovare ed eseguito" in comune, fai quasi tutto il resto in modo diverso. Questa caratteristica di Perl rende Perl un facile ponte tra le funzionalità: puoi scrivere solo uno schema in stile Unix e se Perl è presente il codice, che sia codice Perl o meno, funzionerà sempre - è come un più universale #! /usr/bin/env foo.
zxq9

1
@immibis Dal thread Shebang line parsing mystery sulla mailing list di perl5-porters: " indirera un programma progettato per eseguire indirettamente altri programmi. Il mio ricordo è che doveva essere particolarmente utile in situazioni setuid dove il sistema operativo non forniva ti aiuta molto, e / o forse in situazioni in cui il kernel del sistema operativo ti limita a 32 righe di comando. "
ThisSuitIsBlackNot

2
Questo non fa che rafforzare la reputazione di Perl come il lavello da cucina dei linguaggi di programmazione. Come osservazione interessante, credo che l'implementazione originale di shebang fosse una caratteristica della shell, è stata spostata nel kernel Unix solo in seguito. Perl include molti meccanismi di shell (es. Backtick per sostituire l'output del comando), questo è solo un altro.
Barmar
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.