いくつかのシェルスクリプトチュートリアルを実行していて、次のサンプルプログラムを見つけました。
#!/bin/sh
clear
echo "HELLO WORLD"
#!/bin/sh
冒頭のコメントの意味を教えてください。
これはシバンと呼ばれ、スクリプトの実行に使用するインタープリターを親シェルに指示します。
#!/bin/sh <--------- bourne shell compatible script
#!/usr/bin/perl <-- perl script
#!/usr/bin/php <--- php script
#!/bin/false <------ do-nothing script, because false returns immediately anyways.
ほとんどのスクリプト言語は、コメントで始まる行#
を解釈する傾向があり、次の部分を無視!/usr/bin/whatever
します。そうしないと、解釈された言語で構文エラーが発生する可能性があります。
UNIX(実行可能ビットが設定されているプログラム)でプログラムを実行しようとすると、オペレーティングシステムはファイルの最初の数バイトを調べます。これらはいわゆる「マジックナンバー」を形成し、プログラムの形式とその実行方法を決定するために使用できます。
#!
マジックナンバー0x2321に対応します(ASCIIテーブルで調べてください)。システムがマジックナンバーを確認すると、テキストスクリプトを処理していることを認識し、次のスクリプトまで読み取ります\n
(制限はありますが、ATMから逃れることができます)。インタプリタ(シェバンの後の最初の引数)を特定すると、インタプリタを呼び出します。
他のファイルにも魔法数があります。を介してビットマップ(.BMP)ファイルを見てless
みると、最初の2文字が。であることがわかりますBM
。このマジックナンバーは、ファイルが実際にビットマップであることを示しています。
このスクリプトが存在するファイルが実行可能である場合、hash-bang(#!
)は、スクリプトの実行に使用するインタープリターをオペレーティングシステムに指示します。この場合/bin/sh
、たとえばです。
詳細については、ウィキペディアの記事があります。
最初の行は、スクリプトを直接実行する場合(./run.sh; / bin / sh run.shではなく)、そのプログラム(この場合は/ bin / sh)を使用してスクリプトを解釈する必要があることをシェルに通知します。
また、引数を渡すために使用することもできます。通常は-e(エラー時に終了)、または他のプログラム(/ bin / awk、/ usr / bin / perlなど)を使用します。
#!/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