bash から乗り換える? zsh / fish の選び方
bash から zsh / fish に乗り換えるべきか?
結論: 普段使いの操作を快適にしたいだけなら乗り換える価値はある。ただしサーバー運用とスクリプトは bash のまま残すのが安全。
判断は「何を最適化したいか」で決まる。
- 対話操作(補完・履歴・ハイライト)を快適にしたい → zsh か fish に乗り換える価値あり
- スクリプト・サーバー管理・移植性が主目的 → bash のまま。乗り換え不要
- 設定に時間をかけたくない → fish(インストール直後から快適)
- bash 互換を保ちつつ強化したい → zsh(既存スクリプトの大半がそのまま動く)
重要な前提
乗り換えるのは「自分が対話的に使うログインシェル」だけ。#!/bin/bash で始まるスクリプトの実行シェルは乗り換えても変わらない。両者は別物として切り分ける。
bash・zsh・fish それぞれの機能比較そのものは shell 比較(bash/zsh/fish) で詳しく扱っている。本記事は「実際に乗り換えるかどうかの判断」と「乗り換え作業・トラブル対応」に絞る。
乗り換えると具体的に何が変わるのか?
結論: 変わるのは対話操作の快適さ(補完・提案・色)と設定ファイル。スクリプトの実行環境は変わらない。
乗り換えで実際に体感が変わるのは次の点。
| 体感する場面 | bash | zsh | fish |
|---|---|---|---|
| Tab 補完 | 基本のみ | 強力(候補選択) | 最も賢い |
| 履歴からの先読み提案 | なし | プラグイン要 | 標準で薄字表示 |
| 入力中の色付け | なし | プラグイン要 | 標準 |
| 設定ファイル | ~/.bashrc |
~/.zshrc |
~/.config/fish/config.fish |
| 既存 bash スクリプト | 動く | ほぼ動く | 動かない |
fish は対話の快適さが最大の魅力だが、VAR=value・export VAR=...・if [ ... ] といった POSIX 構文がそのままでは動かない。.bashrc をコピーしても fish では読み込めない。この非互換が乗り換えで最も詰まるポイント。
どのシェルに乗り換えるかの判断フロー
結論: 既存の bash 設定を活かしたいなら zsh、ゼロから快適さを取りたいなら fish。迷うならまず zsh が無難。
次の順で自問すると決まりやすい。
.bashrcに多くの alias / 関数 / PATH 設定を貯めている?- はい → zsh(構文がほぼ同じで移植が楽)
- いいえ → 次へ
- 設定を書くより、入れた瞬間から快適に使いたい?
- はい → fish
- いいえ → 次へ
- Oh My Zsh などのテーマ・プラグイン文化を使いたい?
- はい → zsh
- どちらでもよい → zsh(情報量が多く詰まりにくい)
「インストールして chsh する前に、まず一時的に起動して試す」のが鉄則。zsh または fish とそのまま打てば、ログインシェルを変えずにその場で体験できる。exit で元の bash に戻る。
zsh への乗り換え手順
結論: インストール → 試用 →
chshで既定化 →.bashrcの必要分を.zshrcへ移す、の 4 ステップ。
1. インストールして試す
# Ubuntu / Debian sudo apt install zsh # まずログインシェルを変えずに起動して試す zsh
初回起動時に設定ウィザード(zsh-newuser-install)が出る。とりあえず q で抜けて後から設定してよい。
2. デフォルトシェルに設定
chsh -s "$(which zsh)"
chsh の変更は次回ログイン(端末の開き直し)から反映される。現在のセッションには効かない。反映後は echo $SHELL で /usr/bin/zsh 等になっているか確認する。
3. bash の設定を引き継ぐ
zsh は bash と構文が近いため、~/.bashrc の alias・関数・PATH 追加の大半はそのまま ~/.zshrc に貼って動く。ただし bash 専用の補完設定(bash-completion)や PROMPT_COMMAND は zsh 用の書き方に置き換える必要がある。
# .zshrc に貼ってそのまま動く例 alias ll='ls -alF' export PATH="$HOME/.local/bin:$PATH"
補完やテーマを一括で整えたいなら Oh My Zsh を導入する選択肢もあるが、起動が重くなることがある点は shell 比較記事 のとおり。
fish への乗り換え手順
結論: fish は POSIX 非互換のため
.bashrcは移植できない。設定は fish の文法で書き直す前提で乗り換える。
1. インストールして試す
# Ubuntu / Debian sudo apt install fish # ログインシェルを変えずに起動して試す fish
2. デフォルトシェルに設定
# fish のパスが /etc/shells に登録されているか確認 grep fish /etc/shells chsh -s "$(which fish)"
3. 設定は fish の文法で書く
bash の export や VAR=value は fish では使えない。代表的な書き換えは次のとおり。
# bash: export PATH="$HOME/.local/bin:$PATH"
# fish:
set -gx PATH $HOME/.local/bin $PATH
# bash: alias ll='ls -alF'
# fish(alias は使えるが関数推奨):
alias ll='ls -alF'
fish の対話補完は man ページから自動生成されるため、設定ゼロでも多くのコマンドのオプション補完が効く。これが「設定せずに快適」と言われる理由。
乗り換えで詰まる定番トラブル
結論: 詰まりの大半は「スクリプトを fish 構文で実行した」「
chshが即時反映だと誤解」「設定ファイルを取り違えた」の 3 つ。
~/.bashrc を編集したのに反映されない
乗り換え後に読み込まれるのは zsh なら ~/.zshrc、fish なら ~/.config/fish/config.fish。bash の設定ファイルは対話シェルとしては読まれなくなる。編集先を取り違えていないか確認する。
fish でシェルスクリプトが動かない
> export FOO=bar
fish: Unsupported use of '='. ...
fish は POSIX 非互換。手元の .sh スクリプトを動かすときは fish のままにせず、明示的に bash で実行する。
bash ./deploy.sh
スクリプトの先頭に #!/bin/bash を付け、実行権限を与えて ./deploy.sh とすれば、ログインシェルが fish でも bash で実行される。
chsh が反映されない
chsh は次回ログインから有効。SSH なら再接続、デスクトップ端末なら開き直しが必要。すぐ試したいだけなら chsh せずコマンド名(zsh / fish)で起動する。
元に戻すには(ロールバック)
結論: bash の実体は消えないので、
chsh -s /bin/bashでいつでも戻せる。乗り換えは可逆な操作。
zsh / fish を試して合わなければ、デフォルトを bash に戻すだけでよい。
chsh -s /bin/bash
万一ログインシェルが壊れてターミナルが開けなくなった場合でも、別ユーザーや復旧コンソールから /etc/passwd の該当行の末尾シェルパスを /bin/bash に直せば復旧できる。chsh 自体は /etc/passwd を書き換えているだけ。
インストールした zsh / fish のパッケージを残しておけば、対話用は fish、スクリプト確認用は bash、と使い分けることもできる。乗り換えは「どれか 1 つを捨てる」決断ではない。