簡単なHello World Perlスクリプトがあります。
#!/usr/bin/perl
print 'Hello world.';
を介して実行すると正常に動作しますが、経由perl <file_name>
で実行すると失敗しますsh <file_name>
。
最初の行の私の理解は、Perlシェルを呼び出すことです(#!/ usr / bin / bashがbashシェルを呼び出す方法と似ています)。それでは、これら2つのコマンドの違いは何ですか?
このスレッドを見つけました。http://ubuntuforums.org/showthread.php?t=1133334「この場合、Perlをまったく実行せずに 'print'プログラムを呼び出すシェルを実行しているのsh <file_name>
です。」もしそうなら#!それでは、まだ必要ですか?
(ファイルをchmod + xして直接実行できることを知っていますが、私が使用した2つの方法の違いを知りたいのですが。)
答え1
ファイルを直接実行すると
/path/to/script/filename
shebang行を実行するために通訳を検索します。引数を使用してまたはperl
を実行すると、文書化されたsh
とおりに実行されます。つまり、ファイルをそれぞれPerlまたはシェルのスクリプトとして解釈しようとします。
コマンドライン(たとえばsh foo.pl
、またはperl foo.pl
)で明示的にインタプリタを設定すると、実行するインタプリタを決定するためにshebang行は使用されません。それはい可能なオプションは解析されますが、例えばshebangを使用して#!/usr/bin/perl -w
スクリプトを実行するとフラグが有効になるなど、スクリプトを解釈する必要があるperl foo.pl
プログラム-w
を決定するためには使用されません。
したがって、Perlスクリプトを実行するとは、Perl Shebang行にもかかわらず、システムがそれをスクリプトsh foo.pl
として解釈しようとすることを意味します。sh
答え2
では、スクリプトを実行可能にしていませんか? shは、これらのファイル拡張子を持つエントリが実行可能であると自動的に想定しないため、それを実行またはperl <file name>
実行可能にする必要があります。chmod +x
答え3
これらの2つは、使用しているシステムにPerlがインストールされている方法によって異なります。次のコマンドを入力してください。
which perl
実行可能ファイルに「perl」というパスが表示されます$PATH
(入力してecho $PATH
実行可能ファイルを確認してください)。$PATH
多くのシステムでは、Perlが通常インストールされる場所です/usr/bin/perl
。これが、ほとんどのPerlスクリプトの先頭にある「shebang」行もここにあると仮定する理由です。
ただし、一部のシステムではパスがperl
異なる場合があります。この場合、perl your_script.pl
シェルを使用してshebang行を解釈するのとは異なる結果を得ることができます。たとえば、./your_script.pl
前者の場合、perl
通訳者は$PATH
スクリプトを解釈し、後者の場合は通訳者が必要に応じて解釈します/usr/bin/perl
。これは同じではないかもしれません。
ほとんどの場合、perl
Perlを直接インストールすると、システムに付属しているよりも最新のバージョンになる可能性があります(参考文献を参照/usr/bin
)。つまり、システムには複数のPerlインタプリタがあります。この場合、何が必要なのかを特定し、そのパスをshebang行にハードコードして、スクリプトが誤ってバージョンのPerlによって誤って解釈されることを避けることをお勧めします。 (use 5.12;
これに関連してセキュリティを強化するためにスクリプトに同様の内容を作成することもできます。)Perlソルバーのバージョンを確認するには、と入力します/path/to/perl -v
。