bashでfunctionが存在するかしらべる

森裕介(プログラマー)
無念

この記事を公開する頃には実家にいるであろう森です。

年末といえば大掃除、ということでマシンの掃除をしようと dotfiles を整理し始めたわけですが下記記述がいけてないなあと思いつつずっと放置してました。

# https://github.com/jiska/dotfiles/blob/master/.bashrc のしたのほうの定義
# set git-complation.bash
# see more:
# htps://raw.github.com/git/git/master/contrib/completion/git-completion.bash
if [ -f $(brew --prefix)/etc/bash_completion.d/git-completion.bash ]; then
PS1='\u:\w\$ $(__git_ps1 "[%s] ")'
fi

ファイル git-completion.bash が存在してたらプロンプトにGitのディレクトリ名を表示させるようにPS1を定義してるわけですが、 ここはファイルの存在チェックじゃなくて関数の __git_ps1 が存在するかチェックすべきですよね…。

設定した当時は関数が定義されているのがどうすればいいのかわからなかったのでこんなやっつけ対処をしていたのですが年末大掃除を機に真面目に定義しようと思います。

ずばり type コマンドで実現できました。

# 関数だったら function
type -t __git_ps1
function
# 組み込みコマンドだったら builtin
type -t cd
builtin
# aliasだったらずばりalias
type -t l
alias
# and more...

__git_ps1function だったら、という条件にすればいいわけですね。 ということで先ほどの設定はこうなりました。

# git_ps1
if [ "$(type -t __git_ps1)" = "function" ]; then
PS1='\u:\w\$ $(__git_ps1 "[%s] ")'
fi

多少はスマートになりました。

まとめ

  • typeコマンド便利
  • イケてない記述を放置しとかないでさっさと解決しとこう
  • 掃除はこまめにやろう