Dlaczego nie widzę żadnych błędów składniowych, kiedy wykonuję skrypt w języku Python w Perlu?

85

Właśnie napisałem testowy kod Pythona do test.pyi uruchamiam go w następujący sposób:

perl test.py

Po chwili zrozumiałem swój błąd. Mówię „po chwili”, ponieważ kod Pythona jest faktycznie poprawnie wykonywany, jak w interpreterze Pythona!

Dlaczego mój Perl interpretuje mój Python? test.pywygląda tak:

#!/usr/bin/python

...Python code here...

Co ciekawe, jeśli zrobię coś odwrotnego (tj. Zadzwonię python something.pl), otrzymuję dużo błędów składniowych.

Dacav
źródło
6
Domyślam się, że to z powodu #!początku pliku. Rzeczywiście, jeśli usunę jej huk, uzyskam oczekiwane zachowanie. Czy nie jest to w każdym razie zły pomysł z punktu widzenia bezpieczeństwa?
Dacav,
7
Nie. Punkt ścieżki shebang to wskazanie tłumacza. Jeśli nie ufasz uruchamianiu kodu, to przede wszystkim nie powinieneś go uruchamiać.
Sobrique
1
Nie, nie bardzo. Twój skrypt to plik tekstowy. Nie więcej nie mniej. Nie będzie działać bez tłumacza.
Sobrique,
4
„Dlaczego mój Perl interpretuje mój Python?” nie jest „problemem, którego nie można już powielić, ani zwykłym błędem typograficznym”. Zagłosowano na ponowne otwarcie. Pozytywne głosy w programie Q i A to kwestia powszechnego zainteresowania.
ikegami
1
@ikegami Bez względu na popularność, nie jest to „zwykły błąd typograficzny ... rozwiązany w sposób, który prawdopodobnie nie pomoże przyszłym czytelnikom”. Zagłosowano na ponowne otwarcie.
ThisSuitIsBlackNot

Odpowiedzi:

114

Z Perlrun ,

Jeśli #!wiersz nie zawiera słowa „perl” ani słowa „indir”, program nazwany po the #!jest wykonywany zamiast interpretera Perla. Jest to trochę dziwne, ale pomaga ludziom na maszynach, które tego nie robią #!, ponieważ mogą powiedzieć programowi, że ich POWŁOKA to / usr / bin / perl , a następnie Perl wyśle ​​program do odpowiedniego dla nich interpretera.

Na przykład,

$ cat a
#!/bin/cat
meow

$ perl a
#!/bin/cat
meow
ikegami
źródło
32
Łał. Porozmawiaj o swoich niejasnych funkcjach. Używam Perla od ponad 20 lat i nie miałem pojęcia, że ​​to zrobił.
cjm
4
Zacząłem używać Perla v4 na DOS, VMS i Solaris. To cechy niezależne od systemu operacyjnego / mostkowania, takie jak ta, które znacznie ułatwiły życie między platformami.
tjd
1
@MarcvanLeeuwen Kiedy piszesz programy dla Linuksa, OSX, VAX / VMS, Windows, Solaris, OS / 2 i czegokolwiek innego, najbardziej irytującą częścią portowania programu w języku skryptowym jest jego rozpoczęcie, ponieważ wiele z tych systemów, choć zwykle dzieląc wspólną cechę „wpisz polecenie, znajdź i wykonaj”, prawie wszystko inne rób inaczej. Ta cecha Perla sprawia, że ​​Perl jest łatwym pomostem w funkcjonalności - możesz napisać po prostu shebang w stylu uniksowym, a jeśli Perl jest obecny, kod, niezależnie od tego, czy jest to kod Perla, zawsze będzie działał - jest bardziej uniwersalny #! /usr/bin/env foo.
zxq9
1
@immibis Z wątku Shebang line parsing mystery z listy mailingowej perl5-porters: „ indirbył programem przeznaczonym do pośredniego wykonywania innych programów. Przypominam sobie, że miał być szczególnie przydatny w sytuacjach setuid, w których system operacyjny nie zapewniał natywnie bardzo pomożesz i / lub być może w sytuacjach, gdy jądro systemu operacyjnego ogranicza cię do 32-znakowych linii poleceń. "
ThisSuitIsBlackNot
2
To tylko utwierdza reputację Perla jako zlewu języków programowania. Co ciekawe, uważam, że oryginalna implementacja shebang była funkcją powłoki, dopiero później została przeniesiona do jądra Uniksa. Perl zawiera wiele mechanizmów powłoki (np. Lewe apostrofy do zastępowania wyników poleceń), to tylko jeden więcej.
Barmar