web-dev-qa-db-ja.com

Unixでは、シェルスクリプトと実行可能ファイルの違いは何ですか?

私は このサイトでのこの質問 を見たので、この質問をするように促されました。 Unixで実行可能ファイルとシェルスクリプトの違いは何ですか?

9
Geek

実行可能ファイルとは、実行可能なビットが設定されたファイルを指します(プログラムの実際の実行にエラーがあった場合でも)。

シェルスクリプトは、#!ディレクティブを使用してインタープリターを指定するシェルによって解釈されることを目的とした、特定の実行可能ファイルのtypeです。

12
Chris Down

scriptは次のようなファイルです。

  • 人間が読める形式です(少なくとも、適度に訓練された人間にとって、つまり、ファイルは印刷可能な文字で構成されています)。そして
  • インタープリター は、プログラムの動作を説明する命令として理解されます。

AShellスクリプトは、インタプリタが Shell であるスクリプトです。 UNIXの世界では、「シェル」は Bourne Shell に似たシェルのファミリーを指します。最近のそのようなシェル(ash、bash、ksh、zsh、…)は [〜#〜] posix [〜#〜] シェル標準に準拠しています。より一般的には、「シェル」という単語には、csh、tcsh、fishな​​どの他のコマンドインタープリターを含めることができます。


実行可能ファイルは、実行可能な任意のファイルです。効果的に実行可能にするために、ファイルには2つのプロパティが必要です。

  • ユーザーには、それを実行する権限が必要です。これは、コマンドls -lで確認できます。x文字が権限列に存在する必要があります。
  • ファイルの形式は、システムが実行可能ファイルとして認識するものでなければなりません。実行可能な形式は、いくつかのカテゴリに分類できます。

    • オペレーティングシステムのバイナリ実行可能レイアウトに従って編成されたマシンコードで構成されるネイティブ実行可能ファイル。最近のUNIXシステムのほとんどは、ネイティブ実行可能ファイルに [〜#〜] elf [〜#〜] 形式を使用しています。
    • スクリプト。実行可能スクリプトは、2つの文字#!とファイルへのパスで構成される Shebang 行で始まるファイルです。そのようなファイルを実行するために、カーネルはインタプリタプログラムを実行し、スクリプトへのパスを引数として渡します。
    • システムによっては、おそらく他のフォーマット。たとえば、Linuxは binfmt_misc 機能を介して任意のファイル形式を登録できます。これにより、Javaバイトコードファイルを登録済みの [〜#〜] jvm [〜#〜] を介して実行できるようになり、Windowsの実行可能ファイルを Wine など.

実行可能であることはシステムに依存することに注意してください。たとえば、AMD64 LinuxバイナリはAMD64 Linuxシステムでは実行可能ですが、32ビットシステムでは実行できません。 Androidのバイナリは、通常のLinuxインストールでは実行できません。Windows実行可能ファイルは、Wineが存在する場合のみLinuxで実行可能です。#!/usr/local/bin/Rubyで始まるスクリプトは、は/usr/local/bin/Rubyにあるプログラムです。


通常、シェルスクリプトは実行可能です。ただし、実行する権限がない場合は、実行できない可能性があります。それを明示的にインタプリタに渡すことでそれを解釈させることもできます(例:bash /path/to/script)—「解釈させる」は「実行する」と言う素晴らしい方法です。

シェルスクリプト:

シェルスクリプトは、シェルによって解釈される一連のコマンドです(通常、shまたはsh互換のシェル、場合によっては別のシェルです)。

スクリプト名は、「。sh」、「。bash」、「。csh」などで終わることができますが、必ずしもそうである必要はありません(起動するシェルに関するヒントを与えます)。

わかりやすくするために、スクリプト名はscriptで、起動するシェルはbashであると想定します。

シェルで起動する一般的な方法は、次のとおりです:bash /absolute/path/to/the/scriptまたはbash ./relative/path/to/the/script。この方法では、実行可能ビットを設定する必要はありません。これは、bashによってのみ読み取られ、コンテンツを実行するためです。

それも設定できます現在のシェルセッションから直接起動できるように+ x(実行可能)に設定することもできます:/ absolute/path/to/the /スクリプト(または./relative/path/to/the/script)。注意:デフォルトでは、この方法で起動すると、入力したシェルまたはからposixシェルを介して起動されます(動作はOSに依存します)。そのため、実行されるはずのシェルではない可能性があります。そのため、スクリプトの最初の行として#!/ path/to/good/Shellを指定できます(そうする必要があります)。これにより、OSに対して、そのスクリプトが/ path/to/good/Shellによって実際に起動されることを示します。

実行可能:

実行可能ファイルは、起動されることになっているユーザー/グループに「x」ビットが設定されているファイルです。通常は「バイナリ」またはスクリプトです。

ヒント:file /some/fileは、ファイルの内容について詳しく教えてくれます。いくつかの例を見るには、file /usr/bin/bashまたはfile /etc/profileを試してください。

2
Olivier Dulac