[Shell] 外部ファイルで簡易オブジェクト指向にする方法と理想環境の追求

Linuxサーバーを使う事はWEBシステムにとっては非常に大きなメリットをもたらします。
そしてサーバー運用や、手軽な作業実行において、shellスクリプトは非常に効率的な言語でもあります。
windowsで言うところのDOSプロンプト、MacOSのターミナルも、同じ用途で使うことは出来ますが、Shellスクリプトを自在に操れるようになると、LinuxOSを思うがままに操れる非常に素敵な機能であるとも考えられます。
そんなshllスクリプトをサービスフレームワークに取り込みたいと考え、任意な構造体を持ちたいと考えて、オブジェクト指向のように必要なプログラムを必要な場面で呼び出して実行して作業を処理できるような仕組みを作ろうと考えました。
そんなshellフレームワーク構造についての思考と簡単なサンプルを集めてみました。
外部のshellプログラムを柔軟に呼び出す方法
階層構造
shellプログラムを複数作って、root階層に設置されたファイルから、子階層の任意プログラムを呼び出して実行する事で簡単なファイル管理できるオブジェクト指向が構築できます。
1 2 3 4 5 |
[root] ├ index.sh └ shell/ ├ ls.sh └ cat.sh |
データの受け渡しはargv
基本的に呼び出すプログラムは”index.sh”のみで、子階層のプラグインを呼び出すためには、引数を与えて個別に呼び出す事で、関数実行の要素にしたいと思います。
どうしてもこうしたスクリプト言語は、1ファイルでのプログラム記述になってしまい、再利用するというよりはバッチ処理をする種別に1ファイルずつ作成するような構造が多いのですが、PHPフレームワークなどとの連動を考えると、個別の処理をファイルで作って、呼び出し方法を一定にすることで、shellだけの構造体を作って一括管理することが可能になります。
バッチファイル実行レベルでしかshellスクリプトを使わない人は、あまり意味のない構造体かもしれませんね。
サンプルプログラム
1 2 3 |
#/bin/bash bash shell/$1.sh $2 |
1 2 3 |
#/bin/bash cat $1 |
1 2 3 |
#/bin/bash cat $1 |
1 2 3 4 |
$ sh index.sh getLists / # Responce bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var |
第1引数でプラグインファイル名、第2引数で受け渡し値を送ってやれば実行されるという簡単な構成です。
受け渡しの値が複数ある場合や、複雑な受け渡し変数になる場合は、第2引数にkey=valueのような形にして、それを整形する処理をindex.shに記述しておくと、より汎用性が高まるでしょう。
データアクセス方法
この階層構造の場合、shellフォルダに入っているプログラムを実行したとして、そのプログラムから、相対パスで任意ファイル(データファイル)を読み込みたい場合は、いったいどういう階層で呼べばいいのでしょうか?
1 2 3 4 |
$ sh index.sh ls ./ # Responce index.sh shell |
./を送ってみたところ、root階層が表示されたので、どうやら、index.shからみた相対階層を送ればいいようです。
よく考えたらshellコマンドを実行しているカレンド階層が基準になっているだけですね。
でも、これはありがたい仕様で、プラグインプログラムをどんな階層を深くしても、一定のデータ読み込み階層で行えます。
ディストリビューション違いを意識させない構造
この構造体で一番気をつけたいのは、Linuxのディストリビューションによって同じ動作をするようにしないといけません。
もちろん、CentOSやDebianなどと、利用ディストリビューションを固定化してもいいのですが、汎用フレームワークにとって必要な条件は、LinuxというOSでディストリビューションを問わない事は大きなメリットにも繋がります。
ディストリビューション依存の処理を行う場合は、index.shで、処理振り分けをする機能を持たせてもいいかもしれません。
既存命令と、任意インストールプログラムの注意点
次に気をつけたいのは、OS依存のデフォルト命令と、任意でインストールするプログラムをきちんと管理して置かなければいけません。
phpなどは、Linuxにデフォルトではインストールされていないので、コマンドでphp-cliを使うような場合は、インストール確認処理を入れるなどの配慮も必要です。
また、同じ感覚でモジュールのバージョン依存してしまう処理なども不具合の元に成りえるので、バージョンチェック機能なども必要かもしれませんね。
こうしたshellフレームワークに興味を持った人や、仕事で利用してみたい人は、是非とも一度ご自身の環境構築を行って、便利なシステム構築にTRYしてみてはいかがでしょうか?