第5章:環境

第5章では、環境変数など環境に関して勉強するみたい。ちょっとずつUNIXっぽくなってきました。第10章でシェルスクリプトを書いていくみたいなので、まだ基本の半分って感じです。。。先はまだまだですが、楽しみながらがんばってみまする。

シェルスクリプトを定義する

シェルスクリプトの最初に書く

#! /bin/sh

の「#!」はマジックナンバーで、これを記述することでこのファイルがインタプリタ的に動作するものとして認識される。その後の「/bin/sh」でどのインタプリタを使用するかを明記する。

環境変数

環境変数とは、プロセスが作られたときに引き継がれる「名前とその値」が組になったもの。子プロセスができるときに親プロセスの環境をコピーしてくるので、同じようにシェルスクリプトも親の環境変数を使用することができる。
setコマンドを引数なしで実行すると、今セットされている変数の名前と値の一覧を確認できる。

子の環境を変更

普通に変数を変更しても環境変数はダメ。環境変数を追加・変更するにはexportコマンドを使用する。このコマンドを使用すると、他のプロセスが普通の変数の値を環境変数として認識できるようになる。サンプルは以下の通り

$ CFLAGS=-g
$ export CFLAGS

exportした変数は、他のコマンドやプロセスにも影響を与えるので、他のプロセスやコマンドに影響を与えたくない場合は、

(CFLAGS=-g; export CFLAGS; コマンド)

もしくは

CFLAGS=-g コマンド)

PATH変数

PATH変数にはディレクトリの一覧が入っており、何かをコマンドを打ったときにそのディレクトリを順番にコマンドが入っていないかを調べてあれば実行する。左のパスから実行してくるのでディレクトリの順番が重要となる。シェルの組み込みコマンドの方がPATH変数より優先度が高い。

シグナルの処理

どんなシグナルがあるかは、/usr/include/sys/signal.hを見ると書いてある。基本的なシグナルを以下に記す。

  • 0
    • 0は実際のシグナルではなく、シェルスクリプトを便利に書こうとするために作られたもの。
    • exitコマンドで終了したり、シェルスクリプトが終わりに達したときにシェルは自分自身にシグナル0を送る。
    • trapに0を指定すると、シェル自身の終了処理を行わせる。
  • 1
    • ハングアップシグナル
    • X windowをクローズしたり、デーモンをリセットしたりするときに使用。
  • 2
    • 割り込みシグナル
    • キーボードからの割り込みを意味する。
    • Ctrl-CやDeleteキーがこれにあたる
  • 3
    • クィットシグナル
    • Ctrl-\を打つと生成できる
  • 9
    • キルシグナル
    • プロセスを強制終了する。
  • 15
    • 終了シグナル
    • アプリケーションを終了させるときに使用する
    • killコマンドのデフォルトのシグナル

trapコマンド

シグナルのキャッチ

trapコマンドでシグナルを受信して処理を行うことができる。例えば、下記の例だと「1とか2のシグナルを受信するとプロセスIDの入ったファイルを削除してスクリプトを抜ける」という動きを行う。

trap 'rm -f /tmp/*.$$; exit 1' 1 2 3 15
シグナルの無視

シグナルを受け取っても、無視してそのまま処理を続けたい時の例。必ず空を指定する。でないと意味が変わってくるので注意。

trap '' 1 2 3 15

シグナルのリセット

trapのコマンドのところに何も書かなかった場合には、シグナル本来の動きをすると言う意味になる。

trapを使った例

スクリプトの終了時に、一時ファイルを消す例。もし、割り込みなどで異常終了してもしっかりと消す。以下にサンプルソース

#! /bin/sh
Cleanup(){
        rm /tmp/*.$$
        exit $1
}
trap 'Cleanup 1' 1 2 3 15
・・・
・・・
Cleanup 0

catの実行中だけ、コマンド入力がcatに渡る例

trap '' 2 3
・・・
・・・
trap ':' 2
cat ファイル
trap '' 2
・・・

リモートシェル

ちょっと興味がわかず、必要になったらと言うことで。。。

入門UNIXシェルプログラミング―シェルの基礎から学ぶUNIXの世界

入門UNIXシェルプログラミング―シェルの基礎から学ぶUNIXの世界