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


回答:


12

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

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


12

スクリプトはどのファイルです。

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

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


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

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

    • オペレーティングシステムのバイナリ実行可能レイアウトに従って編成されたマシンコードで構成されるネイティブ実行可能ファイル。最近のUNIXシステムのほとんどは、ネイティブ実行可能ファイルにELF形式を使用しています。
    • スクリプト。実行可能スクリプトは、ファイルへのパスが後に続く2文字で構成されるシバン行で始まる#!ファイルです。このようなファイルを実行するために、カーネルはインタープリタープログラムを実行し、引数としてスクリプトへのパスを渡します。
    • システムに応じて、おそらく他のフォーマット。たとえば、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)—「解釈させる」は「実行する」と言う素晴らしい方法です。


2

シェルスクリプト:

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

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

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

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

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

実行可能ファイル:

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

ヒント:file /some/fileファイルの内容について詳しく知ることができます。試してみてくださいfile /usr/bin/bashまたは file /etc/profileいくつかの例を参照してください。


現在のシェルによって実行されているシバンレススクリプトに関する記述は正しくありません。動作はOSに依存します。一般に、POSIXシェルまたはログインシェルが使用されます。
jlliagre

この精度をありがとう。回答を編集してコメントを追加します。
Olivier Dulac
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.