LoginSignup
1
3

More than 3 years have passed since last update.

zshとbashでdotfilesを共通化する

Posted at

概要

かつて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

もっと良い方法があったら教えてもらえると嬉しいです。

1
3
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3