rcmdnk's blog

Banji Wrapper (Banji books)

homebrew-file を使ってBrewfileを管理するとき、通常のbrewコマンドで 何かインストールした後とかに自動的にBrewfileもアップデートするために brewコマンドに対してラッパースクリプトを作っていましたが、 それだと弊害があるのでラッパー関数を用意してそれを読み込むように変更してみました。

ラッパースクリプト

以前あったものはこれ:bin/brew-wrap at v2.2.1

これを

.bashrc
1
2
3
4
5
...
if type brew >& /dev/null && type brew-file >& /dev/null && type brew-wrap >& /dev/null;then
  alias brew="brew-wrap"
fi
...

みたいにしてログイン時にaliasで設定するようにしていました。

が、これだと、brew-fileを再インストールとかしたいときに、 一度アンインストールするとbrewというコマンド自体が使えなくなるので command brewみたいに直接本来のbrewを呼ばないと行けなかったり面倒がありました。

ラッパー関数

ということで、こんな設定ファイルを用意しました: etc/brew-wrap at master

今度は中身はbrewという関数が定義してあります。

この設定ファイルを.bashrc等で

.bashrc
1
2
3
4
5
...
if [ -f $(brew --prefix)/etc/brew-wrap ];then
  source $(brew --prefix)/etc/brew-wrap
fi
...

として読み込んで貰えばOK。

この関数では関数自体でbrew-fileがあるかどうか判断するので、 このラッパー関数が定義された状態で brew-fileをアンインストールしても問題なく動きます。

また、brew install等をいくつか続けて行いたいときに 毎回Brewfileの更新をするのを避けたい場合には

$ brew noinit install ...

と、最初にnoinitを入れて貰えれば通常のbrewコマンドだけ行うようになります。

勿論command brewcommmandを使っても同じことです。

もし設定している人がいたらbrew-file自体を brew update && brew upgradeでアップデートした上で .bashrc等を書きなおしてください。

コマンドの有る無しを確かめる際のTips

ちょっと上の関数を作っていてつまずいたところとして、 brew-fileがあるかないか、を調べるのに、typeコマンドを使っていますが、 最初そのままtype brew-fileとやって、 これがbrew-fileをアンインストールした直後にもTrueになってしまって 上手く行きませんでした。

これは、bashなどではコマンドがハッシュされていて、 アンインストールしてもそれが残っていて存在してると勘違いするからです。

これを回避するにはtype -aと、-aオプションを使うことで ハッシュは無視して、PATHやalias等、現在実際にあるものを 探して全てリストします。

またはwhichコマンドであれば最初からハッシュは無視します。 もしくはhash -rとハッシュ自体をリセットしてtypeを使ったり hashコマンドも同じようにコマンドを検索出来るのでそちらを使ったり。

単にtypeを使ったコマンドの検索はちょっと危険、と言う話。 速度的には勿論ハッシュしてあるものを使った方が速いわけですが、 実際に行うコマンドに比べて十分小さいので通常は type -a等しておいた方が安全です。

下のページには速度とか、上に書いたハッシュの話とか 色々まとまっていて参考になります。

Bashでコマンドの存在チェックはwhichよりhashの方が良いかも→いやtypeが最強 - Qiita

また、ちょっと違う話ですが、

shopt -s checkhash

とコマンドを実行するか.bashrc等に書いておくと、 仮にハッシュテーブルにコマンドがあっても、 常に実際にコマンドが存在するか確かめ、 無ければ通常通り$PATHの中にあるかどうか検索を行います。 これを行うと全コマンド毎回検索するのでちょっと速度が気になることもあるので 通常は設定しない方が良いです。

ただ、コマンドのハッシュを使っていると、 たまに複数インストールしてあるコマンド等で (pythonのバージョン違いとか、/usr/bin/にあるものをさらに /usr/local/bin/に別バージョンを入れたりとか) 後からインストールされたものが反映されなかったり、 また、使ってるものをアンインストールして前の物を使おうとしたら コマンドがない、と言われてしまうことがありますが、 そういった場合には

$ hash -r

としてハッシュをリセットしてあげれば正しいものを見つけてくれる様になります。

Sponsored Links
Sponsored Links

« Homebrew-fileでApp Storeのアプリの情報も残せる様にした octopress-gemojiのアップデート: 訂正版 »

}