私はいくつかのシェルスクリプトチュートリアルを行っていて、次のサンプルプログラムを見つけました:
#!/bin/sh
clear
echo "HELLO WORLD"
#!/bin/sh
冒頭のコメントの意味を教えてください。
私はいくつかのシェルスクリプトチュートリアルを行っていて、次のサンプルプログラムを見つけました:
#!/bin/sh
clear
echo "HELLO WORLD"
#!/bin/sh
冒頭のコメントの意味を教えてください。
回答:
これはshebangと呼ばれ、スクリプトの実行に使用するインタープリターを親シェルに伝えます。
例えば
#!/usr/bin/perl <--perl script'
#!/usr/bin/php <-- php script
#!/bin/false <--- do-nothing script, because false returns immediately anyways.
これはコメントとして実装されているため、その行に来るものはすべて、指定されたインタープリターに「関連」しません。たとえば、すべてのスクリプト言語#
は、で始まる行がコメントであることを理解する傾向があり、その!/usr/bin/whatever
部分を無視します。そうでなければ、その特定の言語では構文エラーになる可能性があります。
exec()
ファイルのシステムコールを呼び出します。
UNIX(実行可能ビットが設定されているもの)でプログラムを実行しようとすると、オペレーティングシステムはファイルの最初の数バイトを調べます。これらは、いわゆる「マジックナンバー」を形成します。これを使用して、プログラムの形式とその実行方法を決定できます。
#!
マジック番号0x2321に対応します(ASCIIテーブルで調べてください)。システムは、マジックナンバーを確認すると、テキストスクリプトを処理していることを認識し、次の\n
時点まで読み取ります(制限はありますが、私はatmをエスケープします)。インタープリター(シバンの後の最初の引数)を識別したら、インタープリターを呼び出します。
他のファイルにもマジックナンバーがあります。経由でビットマップ(.BMP)ファイルをless
見てみると、最初の2文字がであることがわかりますBM
。このマジック番号は、ファイルが実際にビットマップであることを示します。
このスクリプトが存在するファイルが実行可能である場合、ハッシュバング(#!
)は、スクリプトの実行に使用するインタープリターをオペレーティングシステムに通知します。この場合/bin/sh
、たとえばです。
詳細については、Wikipediaの記事を参照してください。
#!/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
ps
や、のようなコードの抜粋#!/bin/sh
はフォーマットする必要があります。