shell 比較(bash/zsh/fish)- 違いと選び方

shell 比較(bash/zsh/fish)- 違いと選び方

結論:どのシェルを選ぶべきか

用途別の選択は明確に決まる。

  • bash — スクリプト・サーバー管理・互換性最優先の場面
  • zsh — インタラクティブ操作の快適さと bash 互換性を両立したい場面(macOS デフォルト)
  • fish — 設定ゼロで補完・ハイライトを使いたい場面

スクリプトの移植性が必要なら bash 一択。設定コストをかけずに快適なインタラクティブ操作をしたいなら fish。その中間で豊富なプラグインエコシステムを活用したいなら zsh が出発点になる。

bash とはなにか?

bash(Bourne Again Shell)はほぼすべての Linux ディストリビューションのデフォルトシェル。POSIX 互換性が高く、サーバー間・CI/CD 環境での移植性は三者の中で最高。

echo $BASH_VERSION
5.2.21(1)-release

主な特徴:

  • GNU/Linux 標準。ほぼ確実にどこにでも存在する
  • POSIX sh との互換性が高い
  • 補完・ハイライトは設定なしでは最小限
  • スクリプトの実績と資料が膨大

#!/bin/bash を書いたシェルスクリプトは bash で動く前提。サーバー上でスクリプトを配布・実行する場合は bash を基準に書く。

bash の補完を強化したい場合は bash-completion パッケージを追加インストールする。ただしインタラクティブな快適さでは zsh・fish に劣る。

zsh とはなにか?

zsh(Z shell)は bash の上位互換として設計されたシェル。Apple が macOS Catalina(2019)以降のデフォルトを bash から zsh に切り替えたことで広く普及した。

echo $ZSH_VERSION
5.9

主な特徴:

  • bash スクリプトの大半をそのまま実行できる(高い互換性)
  • 組み込みの補完機能が強力
  • Oh My Zsh / Powerlevel10k 等のエコシステムが充実
  • グロブ展開の拡張・スペルミス修正・右側プロンプト(RPROMPT)に対応

bash から zsh へ移行する場合、既存スクリプトの大半はそのまま動く。移行コストが低い点が選ばれる主な理由のひとつ。

Oh My Zsh を追加することで数百のプラグインとテーマが使えるが、初期化スクリプトが重くなるとシェル起動が遅くなる点に注意する。

fish とはなにか?

fish(Friendly Interactive Shell)は「設定しなくても使える」をコンセプトに設計されたモダンシェル。補完・シンタックスハイライト・提案機能がインストール直後から動作する。

echo $version
3.7.1

主な特徴:

  • 入力中にコマンドをリアルタイムでハイライト(正しいコマンドは白、存在しないコマンドは赤)
  • 履歴と man ページベースの自動補完が標準搭載
  • 設定ファイルは ~/.config/fish/config.fish
  • POSIX sh 非互換の独自構文

fish の構文は bash/zsh と非互換。VAR=value での変数代入、if [ ... ]export 等は fish では動作しない。インタラクティブ操作専用として割り切り、スクリプトは別途 bash で書く運用が現実的。

bash/zsh/fish の違いを比較する

項目 bash zsh fish
デフォルト採用環境 Linux 全般 macOS なし
bash 互換性 高い 低い
補完(標準) 基本 強力 最も強力
シンタックスハイライト 設定要 設定要 標準搭載
自動補完提案 なし プラグイン要 標準搭載
設定コスト 低い 中〜高 低い
スクリプト移植性 最高 高い 低い
プラグインエコシステム 少ない 豊富(OMZ) fisher
POSIX 準拠 高い 高い 低い

どのような場面でどれを使うか?

サーバー管理・DevOps

bash 一択。スクリプトの移植性とリモートログイン時の可用性が最優先。本番サーバーに fish や zsh がインストールされていないケースは多く、想定外のシェルを前提にしたスクリプトは障害要因になる。

#!/bin/bash
# サーバー間で共有するスクリプトは bash で書く
set -euo pipefail
DEPLOY_DIR="/var/www/app"
echo "deploy started: ${DEPLOY_DIR}"

日常のインタラクティブ操作(macOS・WSL)

zsh か fish が適している。macOS では zsh がデフォルトのため、Oh My Zsh または Powerlevel10k を追加するのが最短ルート。fish はインストール直後から補完・ハイライトが使えるため、設定に時間をかけたくない人に向く。

# zsh をデフォルトシェルに変更
chsh -s /usr/bin/zsh

# fish をデフォルトシェルに変更(インストール済みの場合)
chsh -s /usr/bin/fish

Linux 学習・入門

bash から始めることを推奨する。理由は以下の 3 点。

  1. チュートリアル・書籍・オンラインリソースの大半が bash を前提にしている
  2. #!/bin/bash のスクリプトをそのまま動かせる
  3. どこにでもあるため、学んだことがどの環境でも使える

fish の快適さは魅力だが、bash 構文を学ばずに fish に慣れると後でスクリプトを書く際に詰まりやすい。

現在のシェルを確認・変更するには?

現在のシェルを確認

echo $SHELL
/bin/bash

または ps $$ でプロセス名から確認する方法もある。

ps $$
    PID TTY      STAT   TIME COMMAND
  12345 pts/0    Ss     0:00 -bash

使用可能なシェル一覧を表示

cat /etc/shells
/bin/sh
/bin/bash
/usr/bin/bash
/bin/rbash
/usr/bin/rbash
/usr/bin/sh
/bin/dash
/usr/bin/dash
/usr/bin/zsh
/bin/zsh

デフォルトシェルを変更

# zsh に変更
chsh -s /usr/bin/zsh

# fish に変更(インストール済みの場合)
chsh -s /usr/bin/fish

chsh の変更は次回ログイン(またはターミナルの再起動)から有効。現在のセッションには影響しない。変更後は echo $SHELL で確認する。

fish がインストールされていない場合は以下でインストールする。

# Ubuntu / Debian
sudo apt install fish

# macOS(Homebrew)
brew install fish

よくある誤解

「zsh は bash より速い」 — 起動速度は設定量に依存する。プラグインを大量に追加した Oh My Zsh は素の bash より遅くなることがある。.zshrc の読み込み時間は time zsh -i -c exit で計測できる。

「fish はスクリプトが書けない」 — fish 独自の構文でスクリプトは書ける。ただし POSIX 非互換のため他環境への移植性はない。fish のスクリプトは fish 専用機能(関数・補完定義)に限定し、汎用スクリプトは bash で書く分担が実際的。

「bash は古くて使えない」 — インタラクティブ操作の快適さでは fish・zsh に劣るが、サーバー管理・自動化・CI/CD パイプラインでは bash の安定性と移植性は強みになる。用途次第。

次に読む