ラッパースクリプトとは
あまりズバッと解説したページが見当たらないが。
要するに、あるシェルコマンドを上書き/置換し、その動作を任意に変更するためのスクリプトのことだと思えばよさそう。
これを利用すれば、何らかの理由でコード自体の書き換えができないコマンドの動作を、簡単に変更することができる。
今回は、findコマンドに、~/.gitignoreを利用して特定のパターンを無視するオプションを追加してみたい。
コマンドの種類と優先順位
bashで利用できるコマンドには、以下の5種類がある。
- エイリアス
- 予約語
- 関数
- シェル組み込みコマンド
- ファイル
あるコマンドの種類がどれであるかは、type コマンド名
で判別できる。
また、コマンドの優先順位は上記の通りになっている。つまり、同名異種のコマンドが存在する場合、上にあるコマンドが優先して実行される。
また、ファイルに限っては同名同種のコマンドが存在しうる(パスが通った複数のディレクトリに同名の実行可能ファイルが存在する場合)。この場合は環境変数PATHで左側に書かれているディレクトリに存在するファイルが優先される。つまり、左から順番にファイルの存在チェックが行われ、見付かった時点でそれが実行される。
以上より、ラッパースクリプトを作成するには、以下の二つの方法が考えられる。
- 元となるコマンド名を変更し、同名のラッパースクリプトを作成する
- 予約語やシェル組み込みコマンドは名称変更できないので、基本的に対ファイルのラッパーでのみ使える方法だと思って良い
- より優先される同名のラッパースクリプトを作成する
- 予約語および組み込みコマンドはユーザー側で作成できない
今回の場合、元となるfindコマンドはファイルなので、エイリアス・関数・ファイルのいずれでも置き換えることができる。今回は、ファイルで置き換える。
$ type find
find is /usr/bin/find
前提として、PATH内での優先順位を設定しておく必要がある。以下のようにすると、~/bin/findは、/usr/bin/findより優先して実行される。
export PATH="$HOME/bin:$PATH"
以下のような~/bin/findを作成する。
#!/bin/bash
command find $* $(printf "! -name %s " $(cat ~/.gitignore))
オプションを追加するとか言ったがスマンあれは嘘だ。めどいからやめた。