web-dev-qa-db-ja.com

UNIXシェルスクリプトの行 "#!/ bin / sh"はどういう意味ですか?

シェルスクリプトのチュートリアルをいくつか見て、次のサンプルプログラムを見つけました。

#!/bin/sh
clear
echo "HELLO WORLD"

コメントで「!/bin/sh」に言及することの意義を教えてください。

132
Jake

Shebangと呼ばれ、親シェルにスクリプトの実行に使用するインタープリターを指示します。

例えば.

#!/usr/bin/Perl   <--Perl script'
#!/usr/bin/php <-- php script
#!/bin/false <--- do-nothing script, because false returns immediately anyways.

コメントとして実装されているので、その行に来るものはすべて、指定されたインタープリターに「関連」しません。例えばすべてのスクリプト言語は、#で始まる行がコメントであることを理解する傾向があり、そうでなければその特定の言語の構文エラーである可能性のある!/usr/bin/whatever部分を無視します。

132
Marc B

UNIX(実行可能ビットが設定されたもの)でプログラムを実行しようとすると、オペレーティングシステムはファイルの最初の数バイトを調べます。これらは、いわゆる「マジックナンバー」を形成します。これは、プログラムの形式と実行方法を決定するために使用できます。

#!は、マジックナンバー0x2321に対応します(asciiテーブルで検索します)。システムがマジックナンバーを認識すると、システムはテキストスクリプトを処理していることを認識し、次の\nまで読み取ります(制限はありますが、ATMをエスケープします)。通訳者(シバンの後の最初の引数)を特定すると、通訳者を呼び出します。

他のファイルにもマジックナンバーがあります。 lessを介してビットマップ(.BMP)ファイルを見ると、最初の2文字がBMであることがわかります。このマジック番号は、ファイルが実際にビットマップであることを示しています。

43
Foo Bah

このスクリプトが存在するファイルが実行可能な場合、ハッシュバン(#!)は、オペレーティングシステムに、スクリプトの実行に使用するインタープリターを通知します。この場合、たとえば/bin/shです。

詳細については、 ウィキペディアの記事 があります。

8
Kusalananda

最初の行は、スクリプトを直接実行する場合(/ bin/sh run.shではなく./run.sh)、そのプログラム(この場合は/ bin/sh)を使用して解釈する必要があることをシェルに伝えます。

また、一般的に-e(エラー時に終了)の引数を渡すために使用したり、他のプログラム(/ bin/awk、/ usr/bin/Perlなど)を使用することもできます。

5
Kevin