.bash.d を作ってシェルスクリプトを管理する

.bashrc に色々書いていたのものを .bash.d/*.sh に移設してみました。

X11 の xinitrc なんかで使われている方法ですが、シェルスクリプトが入っているディレクトリを別に作って、ターミナル起動時にそこから環境変数やエイリアス、関数を読み込むようにするというものです。

.bashrc にこんな感じで書いておきます。(echo 〜 の部分はおまけ)

~/.bashrc
if [ -d "${HOME}/.bash.d" ] ; then
    for f in "${HOME}"/.bash.d/*.sh ; do
        [ -x "$f" ] && . "$f" && echo load "$f"
    done
    unset f
fi

ファイルはこんな感じで配置しておきます。

~/
/hoge
|
+-- .bashrc
|
+-- /.bashrc.d
    |
    +-- 10-alias.sh (755)
    |
    +-- 20-etc.sh (755)
    |
    +-- 80-test.sh (555)

ターミナルを起動すると読み込まれたスクリプトが表示されます。読み込むスクリプトを実行権限があるものに絞っているので上の構成例であれば 80-test.sh は読み込まれません。

bash
load /Users/hoge/.bash.d/10-aliases.sh
load /Users/hoge/.bash.d/20-etc.sh

実行権限が無くても必要なら後で呼び出せばOK(最初の「.」は source と同意)。ファイル名をグループ別で変えておくとワイルドカードで一括読み込み出来る。

bash
. ~/.bash.d/80*.sh

利点

  • .bashrc がシンプルになる
  • 必要に応じてスクリプトをオフにすることが出来る(一時的に環境変数を変えたりなど)
  • スクリプトをオフにするときにエディタを開いてコメントアウトする必要がない(chmod だけで済む)
  • スクリプトをバックアップ、配布しやすい
  • 機能別でファイルを分ければいいので何を何処に書いたか探しやすい

などなど。

また、ターミナルアプリには TERM_PROGRAM という変数があるのでそれを使ってターミナルアプリ毎にスクリプトを変えてみたり。

~/bashrc
if [ "${TERM_PROGRAM}" = "Apple_Terminal" ] ; then
    #Terminal.app で実行する内容
    . ${HOME}/.bash.d/apple_terminal.sh
else
    #それ以外のターミナルアプリで実行する内容
    . ${HOME}/.bash.d/other_terminal.sh
fi

関数は declaretypeset で確認できる。関数を解除する場合は unset 関数名 で解除可能。