エイリアスよりも強力なシェル関数
エイリアスによる置換は、定義したものと厳密に同じコードに対してのみ有効であり、類似のコードには適用されない。そのため、エラー処理やカスタムの終了コード生成によるフロー制御が行えず、変数も利用できない。こうした処理が必要になってきたら、シェル関数の使い方を覚えるとよい。
シェル関数は、完全なサブスクリプトとして構造化されたコードブロックであり、いったん記述しておけば必要になったときに任意のスクリプトから呼び出すことができる。bashで関数を定義するには、以下の2つの方法がある。1つはfunctionキーワードを使うもので、もう1つはこのキーワードの代わりに丸かっこを使うものだ。
function my_function { code }
my_function () { code }
どちらの構文を使うにせよ、シェル関数は呼び出しの前に定義しておく必要がある。関数の入れ子(ネスト)や再帰呼び出しにも対応しており、関数内ではそのシェルで利用可能な構造体のほとんどが使える。ただし、関数のコードでは、その関数を利用するスクリプトとの間でどのようなやりとりをするかに注意する必要がある。
スクリプトで関数を利用できるのは、その関数が定義済みでそのスクリプト内であらかじめ宣言されているか、そのスクリプトを起動するシェルにおいて既知のものである場合に限られる。関数の作成と読み込みは、(概念的に)少なくとも4つの方法で行える。1つはスクリプトに書くのと同じようにコマンドラインから入力する方法であり、その定義を永続的なものにする方法として、すべての関数をファイルに記述して保存し、コマンドラインまたは任意のスクリプトから「.」コマンドでそのファイルを読み込むというやり方がある。
また、シェルプロンプトのカスタマイズによって、シェルプロンプト自体の内部で関数を定義するという意外な方法もある。さらに次のように、同一の関数に対して複数のバージョンを用意し、ほかの変数の値によって動作を変えることも可能だ。
if [ "$USER" eq "root" ]
then
. /etc/root_only_functions.sh
else
. /etc/normal_users_functions.sh
fi
backup_all_files # depends on user
この「backup_all_files」関数は、スクリプトがrootで実行された場合には「/etc/root_only_functions.sh」に記述された内容が、その他の場合には「/etc/normal_users_functions.sh」に記述されたものが実行される。ここで1つ注意したいのは、同じ関数の定義が2回以上行われている場合は最後のものが呼び出される点だ。
