Linuxのファイル拡張子とプログラムとの関連付け

Linuxのファイル拡張子とプログラムとの関連付け

Windowsでは、ファイル拡張子をプログラムに関連付けることができます。たとえば、拡張子のためにインストールされたインタプリタで
ファイルを実行できます。test.plLinuxでは、最初の行にする必要があります。 Linuxでは、ファイル拡張子とプログラムの間に相関関係がないからですか?Perlpl
#!/usr/bin/perl

答え1

いいえ、そういう意味ではありません。実行権限が設定されたテキストファイル(例:)があり、chmod a+x somefileファイルの最初の行が次のような場合

"#!/path/to/executable"

スクリプトの実行に使用するプログラムをUnixに通知するだけです。テキストファイルが実行可能(スクリプトなど)としてマークされると、Unixはこの方法で指定されたすべてのプログラムを起動し、テキストファイル(スクリプト)の残りの部分をそのプログラムに送信します。通常、指定されたプログラムは、シェル(または/bin/sh)、一部のプログラミング言語(Perl、Python、またはRuby)に対してインタプリタ、またはスクリプトを実行する他のプログラム(テキストマニピュレータAwkまたはSedなど)です/bin/csh/bin/bash

通常、「#」は、次の場合にのみ複数の言語でコメントを指定します。最初この行は特別な「#!」で始まります。ファイルが実行可能ファイルとしてマークされているが「#!」で始まらない場合、Unixはそのファイルが一種のバイナリファイル(Cコンパイラやリンカによって生成されたELF実行可能ファイルなど)であると仮定します。

通常、Unixはファイルサフィックスに依存しません。多くのプログラムは、一般的なサフィックスを必要とせず、自動的に追加することもありません。 1つの例外は、プログラムの1つ(間違ったサフィックスについて文句を言うプログラムの1つ)gzipbzip2

代わりに、ファイルは「魔法の数」と他の識別子を見つける一連のテストによってその内容で識別されます(fileこれをテストするためにいくつかのファイルでコマンドを試すことができます)。また、GNOMEとKDEのファイルブラウザでファイルを開く/編集するためのアイコンとプログラムのリストを選択するためにも使用されます。ここでは、これらのテストでファイルのMIMEタイプを識別し、Windowsのサフィックスの代わりにMIMEタイプに関連するリストで表示および編集に適したプログラムを見つけます。

テストの1つは、テキストファイルの最初の行が「#!/ something」であることを確認してから、「something」が何であるかを確認することで、#!/usr/bin/perlファイルをPerlスクリプトとして識別すると言うことができます。副作用。テストでは、「#!」で始まらない場合でも、ファイルを正しく識別する必要があります。それにもかかわらず、ファイルを識別するために使用されるのは、任意のサフィックスではなくファイルの内容です。したがって、.pl(Perl)や.awk(Awk)などの末尾は、純粋にユーザーがファイルの種類を識別するのに役立ちます。

実際には「#!/ something」なしで「スクリプト」を作成できますが、Unixは自動的に実行可能ファイルとして実行できません(どのプログラムでスクリプトを実行するかわかりません)。代わりperl myscriptに、または同じものを使用して「手動で」始める必要がありますpython myscript。大規模なPythonおよびPerlアプリケーションの多くのスクリプトは「内部的に使用される」スクリプトであり、ユーザーが直接呼び出すことができないため、実際には「#!/ something」で始まりません。

代わりに、デフォルトスクリプト( "#!/ something"で始まる)を起動し、そのスクリプトが実行されている間にこれらの他のスクリプトをインタプリタに渡します。

答え2

Windowsでは、ファイル拡張子をプログラムに関連付けることができます。たとえば、test.plファイルはpl拡張子のためにインストールされたPerlソルバーによって実行できます。

はい、しかし拡張子はファイル形式のヒントです。 Perl構文スクリプトは、名前が「.pl」、「.exe」、または「.doc」であるかどうかに関係なく、Perl構文スクリプトです。たとえば、インタプリタを直接呼び出して実行を続けることができます。perl.exe thisfile.docファイルがPerl構文ファイルの場合は機能します。必要に応じて、「.blah」をPerlファイルに関連付けることもできます。

Linux では、最初の行に #!/usr/bin/perl が必要です。

もう一度申し上げますが、これは単なるヒントです。コマンドの引数としてスクリプトを直接呼び出すことで、ShebangなしでPerlファイルを呼び出すことができますperl

Linuxでは、ファイル拡張子とプログラムの間に相関関係がないからですか?

技術的にはそうです。

Linuxには、実際に実行可能ファイルの種類を識別するいくつかの方法があります。このfileコマンドはこれに関する指示を提供します。これには、特定のファイルの種類を決定するために使用される「魔法」(特定のオフセットから特定の長さの文字列)データベースが含まれています。これはファイルの内容を調べてそれが何であるかを判断することによってこれを行います。別の方法はファイル拡張子を使用することです。実際には、「binfmt_misc」というシステムを使用して目的の動作を登録できます。ウィキペディア動作方法を説明します(「魔法」とファイル拡張子を使用)。

Linuxでは、ファイル権限に対する「実行可能」ビットの概念は、ファイルがランダムに「実行可能」と見なされます。実行可能ビットを使用してアプリケーションを実行しようとすると、カーネルはファイルの最初の数バイトを読み取って何をするかを決定します。

  • ファイルが次から始まる場合、指定された#!パスのコマンドは、次のファイルをコマンドの最後の引数として使用して呼び出されます。
  • ファイルがELFで始まる場合は、実行し/lib{64}/ld-linux.so(実際にELFバイナリのセクションヘッダーから取得し、使用したばかりの静的パスではない)、コマンドを実行します(一連のライブラリ静的ロードを実行します)。
  • binfmt_miscに適用されるルールを確認してください。

a.out形式私は彼らの呼び出しにあまり慣れていません。私はld-linux.soローダーがまだそれを処理できると仮定します。

答え3

いいえ、そうではありません。 Shebang(#!)とファイル形式とアプリケーション間の接続はさまざまな目的で使用され、デスクトップLinuxディストリビューションの両方にあります。

コマンドラインまたは他のスクリプトから呼び出される実行可能スクリプトでは、前者を使用するのが一般的であり、ファイル拡張子に依存しません。 Windowsでは、ファイル拡張子に依存するPATHEXT環境変数を介して同様の機能を使用できます。

後者は、デスクトップインターフェイスでアイコンまたはファイル名をクリックするユーザーにサービスを提供します。 Linuxの世界では、これは以下に由来します。MIMEタイプをアプリケーションに関連付けるもちろん、これは特定のツールによって処理され、一般的なデスクトップユーザーの仕様を読む必要はありません。

答え4

GNU / Linuxがファイル拡張子とプログラムの間に相関関係がないというわけではなく、GNU / Linuxが実際に相関関係を気にしないため、そのような比較はできません。

ファイル権限があり、ファイルが実行可能な場合は、常にスクリプトの最初の行でshebangを検索して実行方法を確認します。

一方、Linux用ELFバイナリにはWindowsバイナリなどのexe拡張子がなく、拡張子がなくても常に実行可能です。

関連情報