bash から乗り換える? zsh / fish の選び方

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=valueexport VAR=...if [ ... ] といった POSIX 構文がそのままでは動かない。.bashrc をコピーしても fish では読み込めない。この非互換が乗り換えで最も詰まるポイント。

どのシェルに乗り換えるかの判断フロー

結論: 既存の bash 設定を活かしたいなら zsh、ゼロから快適さを取りたいなら fish。迷うならまず zsh が無難。

次の順で自問すると決まりやすい。

  1. .bashrc に多くの alias / 関数 / PATH 設定を貯めている?
    • はい → zsh(構文がほぼ同じで移植が楽)
    • いいえ → 次へ
  2. 設定を書くより、入れた瞬間から快適に使いたい?
    • はい → fish
    • いいえ → 次へ
  3. 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 の exportVAR=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 つを捨てる」決断ではない。

次に読む