スクリプトの Shebang シーケンス

スクリプトの Shebang シーケンス

Shebangシーケンスが別々のファイルに作成されたスクリプトに含まれているとします。たとえば、スクリプトファイルを作成しますexample.sh

ファイルにshebangシーケンスを追加すると、次のようになります。

 #!/bin/sh

上記のコマンドがコメント(Linux Bashスクリプトでは#通常コメントの開始と見なされます)として認識されないようにするにはどうすればよいですか?

答え1

Shebang は、スクリプトが実行可能で「#!」の場合に限り、実際の Shebang です。ファイルの最初の2文字です。

オペレーティングシステムは実際にファイルの最初の2バイトを調べて、それが「#」と「!」のASCIIコードである(16進数)「23」と「21」であることを理解します。

これらの内容がファイルの後ろに表示される場合、またはファイルを直接実行しない場合、その行は#で始まり、実際にはコメントとして扱われます。

実際に行が次のような場合:

#!/bin/sh

その後、オペレーティングシステムはshebangを見つけて、次を実行します。

/bin/sh [filename]

そして/bin/sh するスクリプトを実行するときは、shebang 行をコメントとして無視します。

注釈として使用されない他の言語では#、最初の行を無視するようにインタプリタに特別なフラグを渡すのが一般的です(例#!/usr/local/bin/tcc -run:)。

答え2

元のシェルにはこの機能はありませんが、コメントがあります。ユーザーが使用するシェル/インタプリタを指定できるようにするメカニズムが必要です。このメカニズムでは、必要に応じて既存のシステムを停止する必要があります(元のシェル用に作成されたすべての新しいスクリプトは元のシェルの指定を許可する必要があり、この新しいシェルを認識しない(元のシェルの以前のバージョンを実行している場合))したがって、新しいシステムは将来のユーザーに負担をかけずに誤ったトリガーのリスクを減らす必要があります。

そのため、ファイルの先頭に特別な説明を追加することにしました。

答え3

これはDenis RitchieがUNIXシェルから導入したメカニズムなので、Linuxシェルはこの機能を継承します。この「魔法の文字列」の最初の行を調べるのはシェル自体内であり、見つかった場合は、shebangの後に指定されたインタプリタが使用されます。この機能について言及した最初の電子メールは、いくつかのbsd4.0ソースコードから引用されました。ここで見ることができます:http://www.in-ulm.de/~mascheck/various/shebang/4.0BSD_newsys_sys1.c.html

関連情報