2011-09-09 8 views
109
は、私はいくつかのシェルスクリプトのチュートリアルを通過すると、次のサンプルプログラムで見つかった

UNIXシェルスクリプトで "#!/ bin/sh"という行は何を意味していますか?

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

を誰もがコメントに「!/bin/sh」を言及する意義が何であるかを教えてくださいことはできますか?

+1

[シェバング](http://en.wikipedia.org/wiki/Shebang_%28Unix%29) – drootang

+1

askubuntuの良い説明:http://askubuntu.com/questions/141928/what-is- bin-shとbin-bashの違い –

+1

[#!/ bin/bashをスクリプトファイルの先頭に置く必要があるのはなぜですか?](http://stackoverflow.com/questions/8967902/why-do-you-need-to-put-bin-bash-at-the-beginning-of-a-script-file) –

答えて

110

シバンと呼ばれ、スクリプトの実行にどのインタープリタを使用すべきかを親シェルに伝えます。

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

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

+3

これは通常、これを処理するシェルではなく、カーネルです。シェルはファイル上の 'exec()'システムコールを単に呼び出すだけです。 – tripleee

7

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

詳細についてはWikipedia articleです。

5

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

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

41

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

#!は、マジックナンバー0x2321に対応しています(アスキーテーブルで参照してください)。システムがマジックナンバーを見ると、それはテキストスクリプトを扱っていて、次に\nまで読むことができます(制限がありますが、atmから脱出します)。通訳者(シバンの後の最初の議論)を特定したら、通訳者を呼ぶでしょう。

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

-3

#!/bin/shまたは#!/bin/bashは、スクリプトの最初の行にする必要があります。最初の行でそれを使用しないと、システムはそのスクリプト内のすべてのコマンドを異なるコマンドとして扱うためです。最初の行が#!/bin/shであれば、すべてのコマンドを1つのスクリプトと見なし、psコマンドで実行されていて、ファイル内のコマンドではないことを示します。

./echo.sh 

ps -ef |grep echo 
trainee 3036 2717 0 16:24 pts/0 00:00:00 /bin/sh ./echo.sh 
root  3042 2912 0 16:24 pts/1 00:00:00 grep --color=auto echo 
+1

スタックオーバーフローはTwitterではありません。実際に "u"や "1st"などの単語を綴ってください。あなたは参考書を書くのを手伝っているので、適切な文法とスペルが重要です。また、適切な書式設定に注意してください。 'ps'のようなコマンドラインから出てくるコマンドと、'#!/ bin/sh'のようなコード抜粋は、フォーマットされなければなりません。 –

+0

私はここで英語をクリーンアップしようとしましたが、それはまだ何を意味するのか分かりません。私は、答えは、スクリプト内のコマンドは別々のコマンドとして実行され、シバンを追加するとプロセスリスト内の単一のコマンドとしてスクリプトが表示されると言います。これは実際には当てはまりません。 – tripleee

関連する問題