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


142

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

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

#!/bin/sh冒頭のコメントの意味を教えてください。



2
askubuntuの良い説明:askubuntu.com/questions/141928/...
fkoessler


回答:


143

これはshebangと呼ばれ、スクリプトの実行に使用するインタープリターを親シェルに伝えます。

例えば

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

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


6
これを処理するのは、通常、シェルではなくカーネルです。シェルは単にexec()ファイルのシステムコールを呼び出します。
tripleee 2013年

47

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

#!マジック番号0x2321に対応します(ASCIIテーブルで調べてください)。システムは、マジックナンバーを確認すると、テキストスクリプトを処理していることを認識し、次の\n時点まで読み取ります(制限はありますが、私はatmをエスケープします)。インタープリター(シバンの後の最初の引数)を識別したら、インタープリターを呼び出します。

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


10

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

詳細については、Wikipediaの記事を参照してください。


5

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

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


-4

#!/bin/shまたは#!/bin/bash、最初の行で使用しない場合、システムはそのスクリプト内のすべてのコマンドを異なるコマンドとして処理するため、スクリプトの最初の行にする必要があります。1行目が#!/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
Stack OverflowはTwitterではありません。「u」や「1st」などの単語を実際に綴ってみてください。あなたは参考書を書くのを手伝っているので、適切な文法とスペルは重要です。また、適切なフォーマットに注意してください。などのコマンドラインから発行されるコマンドpsや、のようなコードの抜粋#!/bin/shはフォーマットする必要があります。
ティンマン

ここで英語を整理しようとしましたが、それがどういう意味かはまだわかりません。答えは、スクリプト内のコマンドが個別のコマンドとして実行され、シバンを追加すると、スクリプトがプロセスリストの単一のコマンドとして表示されることを示していると思います。これは実際には当てはまりません。
tripleee 2016
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.