シェルスクリプトの頭の#!
はマジックナンバーと呼ばれ、
これを書くことによってこのファイルがインタプリタ的に動作するものとして認識されます。
シェルはコマンドを実行するときにexecシステムコールでコマンドを実行しようとします。
そのファイルの先頭に#!
があれば、そのコマンドがインタプリタ型(1行毎に処理していく)
と判断します。
#!
の後に、どのシェルを使うか指定します。
#!/bin/sh
と指定すると、Bシェルが使われます。
「環境変数」とは、プロセスが作られたときに引き継がれる「名前とその値」が組になったものです。
プロセスができるときに親(そのプロセスを作ったもの)の環境変数をコピーしてきます。
環境変数はシェルスクリプト実行時にも親の環境変数をコピーします。
そのため、環境変数はシェルスクリプトで使えるようになります。
あくまでコピーして利用するものであり、そのプロセスで値を変更しても親の値には影響しません。
set
コマンドを引数なしに実行すると、今そこでセットされている変数の名前と値の一覧を確認できます。
env
コマンドでは今セットされている環境変数の一覧が得られます。
環境変数を変更・追加する場合は、export
コマンドを使います。
PATH変数にはディレクトリの一覧が入っており、何かコマンドを打ったとき、 このディレクトリを順番にそのコマンドがあるかないかを調べていきます。
コマンドをPATH変数に追加すると普通のコマンドとして使えるようになります。
以下のようにセットします。
ユーザーの名前を確認する方法としてwhoami
、logname
、id
、who
といったコマンドがあります。
whoami
は現在のログインユーザーを表示します。
logname
は、su
でユーザーを変えても、元のログイン時のユーザーを表示します。
id
コマンドは、ユーザー名とユーザーID、グループ名とグループIDを表示します。
who
コマンドはそのシステムを使用しているユーザーのリストを出します。
以下は、idコマンドを使ってそのユーザーIDが0かどうかを判定するシェルスクリプトです。
hostname
コマンドでそのマシンの名称を取得できます。
uname -n
でも取得可能です。
普通、プロセスはシグナルを受け取ると実行を中断します。
trap
コマンドによりシグナルを受け取った際の挙動を変更できます。
trap
のコマンド内でexitしなければ、そのシェルスクリプトはシグナルを受け取ったときに
処理していたところから再開されます。
sleep
コマンドで1200秒間何も何もしないプロセスを作成し、kill -1
コマンドでプロセスを
ハングアップします。
シグナル0は実際のシグナルではありません。
exitコマンドで終了したり、シェルスクリプトの終わりに達した場合、シェルは自分自身にこのシグナル0を 送ります。
trapに0番を指定すると、そのシェル自身の終了処理を行わせることができます。
ハングアップシグナル(SIGHUP)です。 端末を切断したりするために使います。
割り込みシグナル(SIGINT)です。
キーボードからの割り込み信号を意味します。(Ctrl + CやDelete)
クィットシグナル(SIGQUIT)です。 (Ctrl + \)を打つことで生成します。
キルシグナル(SIGKILL)です。
プロセスを強制終了します。trapの引数にこの番号を指定しても、処理ができずに強制終了します。
終了シグナル(SIGTERM)です。
アプリケーションを終了する際に使用するシグナルで、killコマンドで発行するデフォルト のシグナルです。
killコマンドや割り込みが発生した場合は、
/tmp/
下に作成したファイルを削除する後処理を書いている例です。
実行させるコマンドをシングルクォートで囲んでいるのは展開させずにコマンドに渡すためです。
空のコマンドを指定すると、シグナルを受け取っても無視します。シグナルを受け取っていない ように振る舞います。
シグナルを受け取ったときに、そのシグナル本来の意味のままに動作します。
上の例では、割り込みが発生しても一時ファイルを消去してから終了します。
また、終了コードを0、1で動的に出し分けます。
catコマンド実行時のみ割り込みを許可する例です。