perl プログラムを実行する方法は 2 つあります。
perl test.pl
と
./test.pl
これら2つの正確な違いと、どちらが推奨されますか?
他の答えが述べたことを少し言い換えます。
最初のケースでは、「perl」と呼ばれるプログラム(おそらく、Perl言語インタープリター)を実行し、最初のパラメーターとして値「test.pl」を渡します。これは、「perl」と「test.pl」に応じて、次の3つのいずれかを実行することに注意してください。
$PATH
「perl」が実行可能ファイルまたはシェルエイリアスに存在しない場合(を実行して確認してwhich perl
ください)、シェルは存在しない実行可能ファイルを見つけようとし、perl: Command not found
エラーで失敗します。
「perl」がパス内の実行可能ファイル(またはシェルエイリアス)であり、実際にはPerlインタープリタープログラムではない場合、代わりに実行されます。例として、cshでこれを試してください。
alias perl echo
which perl # Will print "perl: aliased to echo"
perl test.pl # Will print "test.pl". NOT what you intended!
unalias perl
これにより、「perl」エイリアスが実行され、「test.pl」という単語がエコーされます。
「perl」が実際のperlインタープリターであるパス内の実行可能ファイルである場合、最初のパラメーターとして「test.pl」を渡します。その場合、Perlインタープリターはこのパラメーターを(「-」で始まらないため)実行するPerlコードを含むファイルの名前として扱い、ファイルを読み込んで、Perlコードとしてコンパイルして実行します。 。
実行中のプログラムは実際には「perl」であり、「test.pl」は読み込まれる単なるテキストファイルであるため、「test.pl」には「execute」Unixファイル権限は必要ありません。
2番目のケースでは、シェルは現在のディレクトリで「test.pl」というファイルを見つけようとします。ファイルが存在し、実行可能である場合は、プログラムとして実行しようとします。
ファイルが存在しない場合、またはファイルの実行ビットが設定されていない場合、シェルは「コマンドが見つかりません」エラーで失敗します。
ファイルに実行ビットが設定されている場合、シェル(または実際にはUnixカーネルのプロセスローダー)がファイルを実行しようとします。Unixが特定の実行可能ファイルを実行するための規則は、ファイルの最初の2バイト、別名「マジックナンバー」によって管理されます。
マジックナンバーがどのように機能するかについての非常に詳細な説明についてはHow does the #! work?
、SOに関する「」の質問を参照してください。
「魔法の数」が「#!」である特別な場合 (別名「シバン」)、ローダーはファイルの最初の行を読み取り、その行の内容(最初の2バイトを除く)を、指定された実行可能ファイルの代わりに実行するコマンドとして扱います。そして、実行可能ファイルへのパスを、シバン行から読み取ったコマンドのもう1つのパラメーターとして追加します。例として:
「test.pl」が最初の行が。のテキストファイルである#!/bin/sh -x
場合、カーネルは。を実行し/bin/sh -x ./test.pl
ます。
「test.pl」が最初の行が。のテキストファイルである#!/usr/bin/perl
場合、カーネルは。を実行し/usr/bin/perl ./test.pl
ます。
「test.pl」が最初の行が。のテキストファイルである#!perl
場合、カーネルは。を実行しperl ./test.pl
ます。
「test.pl」が最初の行my $var = 1;
(または処理方法がわからない他の最初の2バイト)を含むテキストファイルの場合、エラーが発生するか、(少なくともRedHat Linuxでは)そのふりをします。暗黙の#!/bin/sh
シバンであり、ファイルをBourneShellスクリプトとして実行しようとしました。もちろん、シェルスクリプトではなくPerlコードだったので失敗します
perl
最初の は、で最初に見つかった を使用してプログラムを実行します$PATH
。2番目は、プログラム内のシバン行が何を言っても使用します。
perl test.pl
./test.pl