
MacのOSがmacOS Catalinaになるにあたり、標準のシェルがZshになったので、今まで使っていたBashからZshに移行する方法を紹介します。
見出し
はじめに
Macのバーションをアップデートしてシェルを起動すると以下のメッセージが表示されます。
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.
これはOSが「macOS Catalina」になるにあたり、標準のシェルがBashからZshに変更されたためです。詳細は公式のページに書かれているのですが、この期にBashからZshに移行することにしましょう。
それでは、BashからZshに移行していきましょう!
方針
今回はBashで個人の設定(「.bashrc」や「.bash_profile」)が終わっている前提で、その設定を壊さないようにしつつ、Zshの基本設定を行うことにします。
Zshの基本設定は、Zshのパッケージマネージャーである「zplug」をまず入れ、それからZshのフレームワークである「Prezto」を入れる方針とします。
もちろん「Homebrew」は設定済みですよね。
BashからZshへ移行
移行していきましょう。
Zshを確認する
まずは、MacにZshがインストール済みであることを確認します。
$ which zsh
/bin/zsh
$ cat /etc/shells
# List of acceptable shells for chpass(1).
# Ftpd will not allow users to connect who are not using
# one of these shells.
/bin/bash
/bin/csh
/bin/dash
/bin/ksh
/bin/sh
/bin/tcsh
/bin/zsh
OKですね。
zplugおよびPreztoをインストールする
Homebrewでzplugをインストールし、Preztoをインストールします。テーマは「Dracula」にします。
なお、今回はBashからZshに移行するので問題ないと思いますが、Preztoをインストールすると「.zlogin」「.zlogout」「.zprofile」「.zshenv」「.zshrc」にシンボリックリンクが張られるので、必要であれば事前に対象ファイルを退避しておきましょう。
$ zsh
$ brew install zplug
$ vi ~/.zshrc
# Initialize zplug via brew
export ZPLUG_HOME=/usr/local/opt/zplug
source $ZPLUG_HOME/init.zsh
# Load configuration framework
zplug "sorin-ionescu/prezto"
# Load pachages
zplug "zsh-users/zsh-completions"
zplug "zsh-users/zsh-autosuggestions"
zplug "zsh-users/zsh-syntax-highlighting"
zplug "zsh-users/zsh-history-substring-search"
# Load theme file
zplug 'dracula/zsh', as:theme
# Install plugins if there are plugins that have not been installed
if ! zplug check --verbose; then
printf "Install? [y/N]: "
if read -q; then
echo; zplug install
fi
fi
# Source plugins and add commands to $PATH
zplug load --verbose
# Source Prezto.
if [[ -s "${ZDOTDIR:-$HOME}/.zprezto/init.zsh" ]]; then
source "${ZDOTDIR:-$HOME}/.zprezto/init.zsh"
fi
# Customize to your needs...
$ zplug install
$ ln -s $ZPLUG_HOME/repos/sorin-ionescu/prezto $HOME/.zprezto
$ setopt EXTENDED_GLOB
for rcfile in "${ZDOTDIR:-$HOME}"/.zprezto/runcoms/^README.md(.N); do
ln -s "$rcfile" "${ZDOTDIR:-$HOME}/.${rcfile:t}"
done
Bashの設定をZshの設定に移行する
「.bash_profile」と「.zprofile」、「.bashrc」と「.zshrc」が対応しているので、内容をコピーします。
$ cat ~/.bash_profile >> ~/.zprofile
$ cat ~/.bashrc >> ~/.zshrc
後は、「.zprofile」および「.zshrc」の中身で動いていないところを修正すればOKです。私が修正したところは「おまけ」を参照して下さい。
シェルをZshに変更する
BashからZshに変更します。
$ chsh -s $(which zsh)
これで移行は完了です。
おまけ
Bashの設定をZshの設定に移行する際に修正した箇所
私の場合は以下の3箇所の修正が必要でした。
1. Bashの補完をZshの補完に変更する
「bash-completion」の設定を削除します。代わりに「zsh-completions」を使うのですが、zplugでインストール済です。
2. プロンプトの設定を変更する
「export PS1=…」のように書いていたら削除します。今回はテーマを「Dracula」にしているので、プロンプトの追加の設定はいりません。
もし自前でプロンプトの設定をしたければ、例えば、公式のGitの「ZshでGitを使う」を参考にして、以下のようにすると、Gitのブランチや状態を好きなように表示させることができます。
export PS1="%10F%m%f:%11F%1~%f $ "
autoload -Uz vcs_info
precmd_vcs_info() { vcs_info }
precmd_functions+=( precmd_vcs_info )
setopt prompt_subst
RPROMPT="$vcs_info_msg_0_"
zstyle ':vcs_info:git:*' check-for-changes true
zstyle ':vcs_info:git:*' stagedstr "%F{yellow}!"
zstyle ':vcs_info:git:*' unstagedstr "%F{red}+"
zstyle ':vcs_info:*' formats "%F{green}%c%u[%b]%f"
zstyle ':vcs_info:*' actionformats '[%b|%a]'
3. anyenvの設定を変更する
私は複数のプログラミング言語を書く関係で「anyenv」を使っているので、その設定を以下のように変更します。
$ vi ~/.zshrc
...
export PATH="$HOME/.anyenv/bin:$PATH"
eval "$(anyenv init - zsh)"
...
なお、もし「ndenv」を使っている人は、非推奨になったので、「nodenv」に移行しておきましょう。そうしないと「anyenv」のインストールでエラーになる場合があります。(実際fishを試した際にエラーが出ました)
ついでに、「nodenv」の「default-packages」というプラグインが使いやすいので紹介します。anyenv経由でnodenvをインストールした場合は最初から使えます。これを使えば、新しいnodeをインストールするたびに、予め「default-packages」上に指定しておいたモジュールをグローバルにインストールしてくれます。
$ touch $(nodenv root)/default-packages
$ vi $(nodenv root)/default-packages
yarn
nodemon
jest
eslint
tslint
flow-bin
typescript
@babel/core
@babel/cli
webpack-cli
@webpack-cli/init
parcel-bundler
express-generator
create-react-app
@vue/cli
$ nodenv default-packages install --all
便利ですね。
Zsh変更時のエラー対応
Zsh変更時に以下のエラーが出た場合。
「zsh compinit: insecure directories, run compaudit for list.」
対象フォルダの権限を変更することで対応します。
$ compaudit
There are insecure directories:
/usr/local/share
$ chmod -R 755 /usr/local/share
$ compaudit
ZshからFishに移行する方法
Fishとは、「The friendly interactive shell」の事であり、使いやすいと評判のシェルです。しかし、POSIX非互換のため、設定の書き方が大幅に異なります。そのため、BashからZshに移行するのとは異なり、ZshからFishに移行するのはいろいろ書き直しが必要になります。興味がある方は、ざっくり概要をまとめるので、試してみると良いでしょう。
Fishをインストールする
$ brew install fish
$ which fish
/usr/local/bin/fish
$ echo /usr/local/bin/fish | sudo tee -a /etc/shells
Password:
$ cat /etc/shells
# List of acceptable shells for chpass(1).
# Ftpd will not allow users to connect who are not using
# one of these shells.
/bin/bash
/bin/csh
/bin/dash
/bin/ksh
/bin/sh
/bin/tcsh
/bin/zsh
/usr/local/bin/fish
fisherをインストールする
fisherはFish用のパッケージマネージャーです。
$ fish
$ curl https://git.io/fisher --create-dirs -sLo ~/.config/fish/functions/fisher.fish
パッケージを入れる
適当にパッケージを入れてみます。(好きなパッケージを入れて下さい)
$ fisher add jethrokuan/z
$ fisher add jethrokuan/fzf
$ fisher add oh-my-fish/plugin-peco
$ fisher add decors/fish-ghq
$ fisher add 0rax/fish-bd
$ fisher add edc/bass
$ fisher add oh-my-fish/theme-bobthefish
Zshの設定をFishの設定に移行する
「.zshrc」の内容を「config.fish」にコピーします。
$ cp ~/.zshrc ~/.config/fish/config.fish
後は、地道に以下の修正を行います。
- zshやzplugの設定を削除する
- 環境変数を「export PATH=」のような書き方から「set -x PATH」のような書き方に変換する
- 関数をZshの書き方からFishの書き方に変換する
- 「anyenv」の読み込みを以下のように修正する (この書き方は頻繁に変わっているので、動かなかった場合は、デフォルトのシェルをFishにした状態で「anyenv init」を実行すれば、その時のanyenvの設定が表示されます)
$ vi ~/.config/fish/config.fish
...
set -x PATH $HOME/.anyenv/bin $PATH
status --is-interactive; and source (anyenv init -|psub)
...
Fishの設定をする
$ fish_config
シェルをFishに変更する
$ chsh -s (which fish)
最後に
いかがでしたか?これで、BashからZshに移行できたことでしょう。後はZshのカスタマイズをすることで、自分色に染めていくと良いでしょう。それでは。
環境
- PC: macOS Catalina 10.15
- Homebrew: 2.1.15
- bash: 3.2.57
- zsh: 5.7.1
- zplug: 2.4.2
- fish: 3.0.2
- fisher: 3.2.9


コメントを残す