PerlでPythonスクリプトを実行すると、構文エラーが発生しないのはなぜですか?


85

テスト用のPythonコードをに書き込んtest.pyだところ、次のように起動します。

perl test.py

しばらくして、私は自分の間違いに気づきました。Pythonインタープリターのように、Pythonコードが実際に正しく実行されるため、「しばらくすると」と言います。

PerlがPythonを解釈するのはなぜですか?test.pyこのように見えます:

#!/usr/bin/python

...Python code here...

興味深いことに、反対の操作(つまり呼び出しpython something.pl)を行うと、構文エラーが大量に発生します。


6
#!ファイルの先頭にあるためだと思います。実際、彼女の強打を取り除くと、期待どおりの動作が得られます。とにかく、それはセキュリティの観点から悪い考えではありませんか?
dacav 2015

8
いいえ。通訳を指定するためのシェバンパスのポイント。コードの実行を信頼できない場合は、そもそもコードを実行するべきではありません。
Sobrique 2015

1
いいえ、そうではありません。スクリプトはテキストファイルです。それ以上でもそれ以下でもありません。通訳なしでは「実行」されません。
Sobrique 2015

4
「PerlがPythonを解釈するのはなぜですか?」「再現できなくなった問題や単純な誤植」ではありません。再開に投票しました。QとAの賛成票は、これが人気のある質問であることを示しています。
ikegami 2015

1
@ikegami人気に関係なく、これは明らかに「単純な誤植...将来の読者を助ける可能性が低い方法で解決された」ものではありません。再開に投票しました。
thisSuitIsBlackNot 2015

回答:


114

perlrunから、

#!行に「perl」という単語も「indir」という単語が含まれていない場合、#!Perlインタープリターの代わりに、にちなんで名付けられたプログラムが実行されます。これは少し奇妙ですが#!、SHELLが/ usr / bin / perlであることをプログラムに伝えることができ、Perlがプログラムを正しいインタプリタにディスパッチするため、そうしないマシンの人々に役立ちます。

例えば、

$ cat a
#!/bin/cat
meow

$ perl a
#!/bin/cat
meow

32
ワオ。あなたのあいまいな機能について話してください。私はPerlを20年以上使用していますが、それが使用されているとは思いもしませんでした。
cjm 2015

4
DOS、VMS、SolarisでPerlv4を使い始めました。クロスプラットフォームの生活を非常に簡単にしたのは、このようなOSにとらわれない/ブリッジング機能です。
tjd 2015

1
@MarcvanLeeuwen Linux、OSX、VAX / VMS、Windows、Solaris、OS / 2などのプログラムを作成する場合、スクリプト言語プログラムの移植で最も厄介な部分は、通常はこれらのシステムの多くが開始することです。 「コマンドを入力し、それを見つけて実行する」機能を共有し、他のほとんどすべてを異なる方法で実行します。このPerl機能により、Perlは機能の簡単なギャップブリッジになります。Unixスタイルのシバンだけを記述でき、Perlが存在する場合、Perlコードであるかどうかに関係なく、コードは常に機能し#! /usr/bin/env fooます。これは、より普遍的なもののようです。
zxq9 2015

1
@immibis perl5- portersメーリングリストのミステリー解析するスレッドShebang行から: "indirは、他のプログラムを間接的に実行するように設計されたプログラムでした。私の記憶では、OSがネイティブに提供しなかったsetuid状況で特に役立つはずでした。あなたは大いに助けになります、そして/またはおそらくOSカーネルがあなたを32文字のコマンドラインに制限した状況で。」
thisSuitIsBlackNot 2015

2
これは、プログラミング言語のキッチンシンクとしてのPerlの評判を確固たるものにします。興味深い観察として、shebangの元の実装はシェル機能としてのものであり、後でUnixカーネルに移行しただけだと思います。Perlには多くのシェルメカニズム(コマンド出力を置き換えるためのバックティックなど)が含まれていますが、これはもう1つだけです。
バーマー2015
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.