#!

Shebang または Hash-Bang とは、スクリプトプログラムの先頭の、文書型定義( Dokumenttypdefinition ; DTD )に似た文字の組合わせ #! のことを指す。Unixの場合。オペレーティングシステムは、プログラムが呼び出されたときに、実行ファイルの先頭が、ダブルクロスエクスクラメーションマークの場合、#!以降のコマンドが後続するすべての引数と実行ファイル自身を引数とし実行されます。

語源

編集

shebang という言葉は、19世紀のアメリカで生まれたのはほぼ間違いありません。元々は小屋、避難所、あるいはテントを意味し、無許可で酒を飲む場所( irisch Shebeen )の可能性もあります。ただし、19世紀半ばからは馬車を指すこともあります(例えばマーク・トウェインが使用した)。

しかし、Shebangは150年以上前から「the whole shebang」という表現で普通に使われており、おおよそ「モノ、コト、物質」と訳されています。これは、アメリカ南北戦争末期に需品係将校( quartermaster )の文脈で生まれた表現「running the whole shebang」に由来しているようです。

Unix の文脈では sharp bang または hash bang の短縮形として解釈され、2つの頭文字を指す。Unix の用語では、感嘆符は bang と呼ばれ、ダブルクロスhash または sharp とも呼ばれます。

来歴

編集

このメカニズムは、シェルスクリプトファイルを異なるUnixシェルの「sh」と「csh」を区別するために導入されました。 ファイルの最初の文字が、「:」または「#」のが判断するために使われました。 それぞれのスクリプト言語で、「:」は空の関数(NOP)の呼出しを表し、「#」はコメントを表すので、スクリプトの機能に影響を与えることなくファイルに含めることができます。

Shebangは、ベル研究所のUnixバージョン7と8の間の期間にDennis Ritchieによって導入されました。同時期にBSD Unixに採用された[1]。Unixバージョン8からはベル研からリリースされなくなったので、ShebangはBSDを通じて広く知られるようになった。

実装

編集

Shebang文字は、ASCII文字セットで実行可能なプログラムのマジックナンバーを人間が読める形にしたもので、マジックストリング( Magic string )は16進数の0x23 0x21に相当します。 これにより、オペレーティングシステムカーネルはファイルをスクリプトとして認識し、指定されたインタープリターで実行できます。 このように、スクリプトはほぼ本格的なプログラムであると見なされ、オペレーティングシステムでそのように呼び出すことができます。

使用方法

編集

典型的なShebangの行は次のようなものです。

#!/bin/sh

この行は、オペレーティングシステムに、このファイルをインタプリタープログラム /bin/sh(この場合は標準的なUnixシェル)で実行するように指示します。

Shebang 行 #!/bin/cat は、プログラムを (偽の) クワインにし、その名前を cat プログラムに渡すことで、その内容を標準出力に出力します。

既知の問題

編集

パス

編集

いくつかの場所はFilesystem Hierarchy Standard (FHS) で正規化されているので、FHSに準拠したUnix系システムでは、対応するプログラム、またはそれらへのシンボリックリンクを正規化されたパスに保持しなければなりません。したがって、POSIX互換のUnixシェルは、常に/bin/shの下にあります。しかし、すべてのUnix派生製品がFHSに準拠しているわけではなく、他のインタプリターの位置は正規化されていません。そのため、スクリプトをあるコンピュータから別のコンピュータにコピーする際に、shebang行を変更する必要がある場合があります。

これを改善するために、envプログラムを使用することができます。

#!/usr/bin/env python

env は、オペレーティングシステム設定の標準環境変数、つまり環境変数 PATH を読み込んで、目的のプログラム(ここでは python)をその場所に関係なく起動し、これらのプログラムパスの中から python プログラムを探します。このように、この例では/usr/bin/pythonの下にPythonインタープリターを見つけます。しかし、envはすべてのシステムにインストールされているわけではなく、必ずしも常に同じ場所にあるわけではありません。

場所が不明な場合は、コマンドラインのコマンド typewhich が役に立ちます。

user@localhost:~$ type python
python is /usr/bin/python
user@localhost:~$ which python
/usr/bin/python
訳註
user@localhost:~$ type type
type is a shell builtin
user@localhost:~$ which which
which: shell built-in command.
user@localhost:~$ which type
/usr/bin/type
user@localhost:~$ type which
which is /usr/bin/which
typewhich も、シェルの内部コマンドですが、お互いは外部コマンドと認識しています。

Windows

編集

WindowsがShebangを認識しません。しかし、WindowsとUnixの両方で開発されたプログラムパッケージをWindowsでインストールした場合、プログラムの一部がShebangを解釈してしまうことがよくあります。例えば、WebサーバーのApacheは、CGIスクリプトを呼び出すときにShibangを「理解」します。以下は、PythonスクリプトがApacheから呼出される例として考えられるものです。

#!C:\Program Files\Python 2.8\bin\python.exe

スクリプト言語におけるコメントの特殊な形式としてのShebang

編集

shebangを使うことで、理論的にはどんなインタプリターでも呼出すことができ、そのインタプリターにスクリプト全体を渡して処理させることができます。ただし、Shebangをインタプリターの呼び出しとして使うのは、Shebangにインタプリターそのものに対する命令が含まれていないため、インタプリターがShebangを無視した場合のみ可能です。ダブルクロスのため、多くのスクリプト言語ではshebangはコメントとして評価され、無視されます。あるいは、インタプリターは常に最初の行をスキップすることができます。

Ruby、Perl、Python、PHPなどの一般的な言語では、行コメントにダブルクロスを使用するため、このようなケースになります。しかし、他の言語では、(行)コメントには他の文字が使われます。例えばREXXインタプリターは、一般にこの文字をシンタックスエラーと見なします。このため、すべてのインタプリターがShebang経由での呼び出しに適しているわけではありません。

Shebangがプリプロセッサーに対応し、その行を評価して削除し、残りをインタープリターやコンパイラーに渡すこともあります。例えば、様々なOS上でFree PascalによるPascalスクリプトの実行を可能にするコマンド、InstantFPCがそうである[2]。 Pascalはコメント区切りとして「#」文字を使用しませんが、InstantFPCはShebang行を削除して他のパラメータを抽出するのでスクリプトはエラーなくコンパイル・実行されます。バージョン0.9.31では、Lazarusはshebang行も認識します[2] Lispの方言SchemeD言語では、ダブルクロスは一般にコメントではありませんが、shebang行は特に最初の行としてコンパイラーに無視されます[3][4]

ファイルの先頭にあるUnicodeバイト順マーク

編集

スクリプトファイルにはテキストが含まれており、テキストファイルとして分類されます。 Unicodeでエンコードされたテキストファイルは、多くの場合、バイト順マーク(BOM)で始まります。 そのようなBOMがスクリプトファイルの先頭にある場合、つまりShebang構文の前にある場合、Shebang構文は認識されない可能性があります(定義上、これも先頭にある必要があります)。 したがって、Shebangを使用するスクリプトでは、ファイルの先頭にBOMを含めることはできません。

参照

編集
  • Linuxでのバイナリファイルに対する正しいインタプリターの検出 : en:binfmt_misc

参考文献

編集
  1. ^ in-ulm.deバージョン 4BSD にすでに存在し、バージョン 4.2BSD ではデフォルトで有効化されています(1980年以降のアーカイブから抜粋;抄訳 2022-07-16)。
  2. ^ 2.0 2.1 Deutsche Dokumentation zu InstantFPC
  3. ^ SRFI-22
  4. ^ D Programming Language Specification (PDF, 1,46 MB)”. 2017年10月17日閲覧。

外部リンク

編集