概要
かつてmacでzshがデフォルトになった時に、
**「もうbash環境は卒業だー」**とばかりにdotfilesをzsh仕様に修正しました。
ですが現実は厳しく、未だにbash環境をいじる機会はなくなりません。
(特に業務時)
そこでzshとbashの両方で使えるように、dotfiles内をなるべく共通化してみました。
zshとbashの違い
ファイル構成が違う
- bash → .bash_profile / .bashrc
- zsh → .zprofile / .zshrc
zshとbashで配置するファイルを変える必要があります。
また、当然中身も違ってきます。
使えるaliasが違う
alias -g L='| less'
Global Aliasはzsh限定の機能です。
bashで上の宣言をするとエラーになります。
対応
1. 判定用functionを作る
function is_bash_shell() {
if [ $SHELL = "/bin/bash" ]; then
true
else
false
fi
}
bashを使っているかどうかの判定には色々なやり方があるようですが、
もし他の処理が必要になった場合は、このfunctionを拡張していきます。
2. スクリプト内で処理を分ける
install.sh
. ./.functions
# bash
if is_bash_shell; then
ln -siv .profile ~/.bash_profile
ln -siv .bashrc ~/.bashrc
# zsh
else
ln -siv .profile ~/.zprofile
ln -siv .zshrc ~/.zshrc
fi
zshとbashで配置するファイルを変えます。
シェル固有の処理は、.bashrcと.zshrcにそれぞれ書いておけばOK。
.aliases
. ./.functions
# global aliases (zsh only)
if ! is_bash_shell; then
alias -g L='| less'
alias -g H='| head'
alias -g T='| tail -n 200'
alias -g G='| grep'
alias -g S='| sort | uniq'
fi
これでGlobal Aliasはzshの時だけ宣言されるようになります。
まとめ
「なるべく処理を共通化させたい」と考えた結果、スクリプト内で最低限の部分だけ分岐するという形になりました。
その後ごちゃごちゃやって、現在はこうなっています。
https://github.com/zizochan/dotfiles
もっと良い方法があったら教えてもらえると嬉しいです。