2017-08-29 17 views
1

私はperlがシバンラインをどう扱うのか理解しようとしています。Perlはシバン線をどのように扱いますか?

I を使用すると、コマンドラインの「コマンド位置」に記載されているインタープリタが、シバン行に記載されているインタープリタよりも優先されると考えることができます。例えば、demoと呼ばれる実行可能なスクリプトがこの

#!/usr/local/bin/perl-5.00503 

printf "$]\n"; 

のように見える場合は...その後、私は次のことを守っなります

$ ./demo 
5.00503 
% /usr/local/bin/perl-5.22 ./demo 
5.022003 

IOW、最初の実行では、シェバングでインタプリタがあります1つは実行中で、2つ目はコマンドラインで言及されたものです。ここまでは順調ですね。

しかし、私は/usr/bin/wcのようなものにシェバングの「通訳」を変更した場合、今、それは常に私がコマンドラインに言及任意のperl通訳打つ:

% cat demo-wc 
#!/usr/bin/wc 

printf "$]\n"; 

% ./demo-wc       # produces the expected behavior 
     4  3  31 ./demo-wc 
% /usr/local/bin/perl-5.22 ./demo-wc 
     4  3  31 ./demo-wc 
% /usr/local/bin/perl-5.14 ./demo-wc 
     4  3  31 ./demo-wc 

AFAICTを、この特殊な動作制限されているようですperl通訳このよう/bin/bash、などの非perl通訳は、シェバングを「却下」ん:

% /bin/bash ./demo-wc 
$] 

一番下の行はperlが言及したインタプリタによってはシェバングを処理するための根本的に異なるポリシーを持っているようだということです。


  1. どうperlは従うためにどの政策決定のでしょうか?
  2. どちらの場合でもポリシーは正確には何ですか?
+1

すでに回答済み:https://stackoverflow.com/a/29563961/152948 – hobbs

+1

@hobbs質問の一部には答えがありません。 – zdim

答えて

6

テストにはいくつかの異なるケースがあります。

./demo...を使用すると、カーネルはマジックナンバー(最初の16ビット)で#!を見つけてそのプログラムを実行するか、失敗した場合にその行をシェルに渡します。

しかし、コマンドラインでperlを起動すると、そのバイナリはシェルによって起動され、そのperlインタプリタ自身がシバンを処理します。この場合、perlの部分は破棄されますが、回線に "perl"が含まれている場合はスイッチ–を考慮します。

shebangがでない場合、がperlを呼び出す場合、Perl特有の動作があります。 perlrun

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

1

他のほとんどのインタープリタとは異なり、perlは#!行の独自の処理を行います。これにより、カーネルの#!ハンドラが単一の文字列を渡すだけであっても、複数のオプション引数を取ることができます。

詳細はperlrunのマニュアルページにあります。関連する部分は次のとおりです。

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

関連する問題