My tech diary

ソフトウェアエンジニアをやっています。技術的内容を中心に調べたことを書いていきます。

bash から zsh への乗り換え

完全に個人的なメモ。

macOS Catalina から、標準シェルが zsh に変更された。 特に bash で困ってないけど、 shell 開くたびに以下のようなメッセージが出てくるのも耐え難いので、今更だけど乗り換えることにした。

The default interactive shell is now zsh.
To update your account to use zsh, please run `chsh -s /bin/zsh`.
For more details, please visit https://support.apple.com/kb/HT208050.

操作面はさておいて、乗り換えで大切なのは dotfiles の扱い。 現時点で .bash_profile.bashrc を以下のように設定しているので、これらを円滑に移行する。

一応、 zsh の設定系の framework として、以下のようなものがあるらしいけど、細かいカスタマイズこそが shell の醍醐味じゃろってことで使わない。 (とかいいつつ、特に .bashrc とかメンテしてなかったけど...)

framework よりは控えめな plugin manager 系のツールもいろいろあるようなので、不便を感じたらこちらは使ってもよいかも。 (結構カオス状態だな...)

とりあえず、今回はカスタムでやってみるのです。

.bash_profile.bashrc の内容を .zshrc に全てまとめる。 また、 zsh の便利機能的なものもちょいちょい追加。

history のオプションに関して、 INC_APPEND_HISTORYSHARE_HISTORY の違いが少しわかりにくかったので、メモ。 デフォルトでは、 HISTFILE へは、 shell が exit するタイミングで書き込まれるんだけど、 INC_APPEND_HISTORY を有効にすると、コマンドが発行される度 (実行前に) HISTFILE に書き込まれるようになる。ただ、これだけだと、他の window で開いている shell からは、この HISTFILE に書き込まれた履歴は使われない。(メモリ上にある、各 shell ごとに管理されている履歴が使われる) SHARE_HISTORY を有効にすると、 INC_APPEND_HISTORY の効果にプラスして、他の window で開いている shell からも即座に、 HISTFILE に書かれた履歴が使われるようになる。別にそこまでは望まないかなっていう場合は INC_APPEND_HISTORY を使えばいい。 なお、 INC_APPEND_HISTORY_TIME というオプションを有効にすると、コマンド開始時刻だけでなく、実行時間も書き込まれる。 (つまりコマンド終了時に書き込まれる) INC_APPEND_HISTORY, INC_APPEND_HISTORY_TIME, SHARE_HISTORY は互いに排他的なオプションとなっている。

prompt での Git のステータス表示に関しては、 vcs_info というモジュールを使ってみた。 push や stash のステータス表示を標準ではサポートしていないようで、以前に比べてそのあたりは不満はあるけど、カスタマイズはできるらしいし、まずは標準のまま使ってみる。 (追記) 早速だけど、やっぱり不便を感じたし、 VCS っていってもほぼ Git しか使わないので、以前と同様 Git 公式の git-prompt.sh を使って、 prompt 表示を行うことにした。

補完系に bash では scop/bash-completion を使っていた。 zsh は標準でもある程度のコマンド群をサポートしてくれているみたいだけど、追加で主要なものを追加しておく。

curl -L https://raw.githubusercontent.com/docker/cli/master/contrib/completion/zsh/_docker > ~/.zsh.d/completions/_docker
curl -L https://raw.githubusercontent.com/docker/compose/master/contrib/completion/zsh/_docker-compose > ~/.zsh.d/completions/_docker-compose

また 3rd-party 製のものが zsh-users/zsh-completions に公開されているので、これも使用する。

git clone git://github.com/zsh-users/zsh-completions.git ~/.zsh.d/completions/zsh-completions
mv ~/.zsh.d/completions/zsh-completions/src/* ~/.zsh.d/completions/
rm -rf ~/.zsh.d/completions/zsh-completions

最終的にこんな感じになった。たぶん、使いながらちょいちょい変更することにはなるだろう。

最後に以下のコマンドでバッツん切り替える。

chsh -s /bin/zsh

References