bash vs zsh 徹底比較|違い・移行方法・どちらを選ぶべきか2026年版

bash vs zsh 徹底比較|違い・移行方法・どちらを選ぶべきか2026年版

「BashからZshに乗り換えるべきか?」——macOSがデフォルトシェルをZshに変更した2019年以降、この問いを持つエンジニアが増えました。

Zshはインタラクティブな使い勝手の良さで人気があり、Oh My ZshやStarshipといったエコシステムも充実しています。一方でBashはほぼすべてのLinux環境にプリインストールされており、シェルスクリプトの事実上の標準として今も君臨しています。

本記事では以下の疑問に答えます。

  • BashとZshの具体的な違いは何か
  • 補完・プロンプト・スクリプト互換性の観点でどう差があるか
  • 自分のユースケースにはどちらが向いているか
  • Zshに移行する場合の手順と注意点


目次

結論:先に答えを出す

BashZsh
こんな人に向いているサーバー管理・シェルスクリプトがメイン・環境を選ばず使いたい日常のターミナル操作を快適にしたい・補完・プロンプトにこだわりたい・macOS使い
デフォルト搭載ほぼ全てのLinuxmacOS(Catalina以降)、一部Linux
補完機能基本的非常に強力
プロンプトカスタマイズ可能(やや煩雑)非常に柔軟
スクリプト互換性POSIX準拠・業界標準Bashとほぼ互換(差異あり)
プラグインエコシステム限定的Oh My Zsh・Zinit等が充実
学習コスト低い(情報が豊富)やや高い(設定が多い)

一言でいうと:

  • サーバー管理・スクリプト開発がメインなら Bash
  • 日常のターミナル操作を快適にしたいなら Zsh

BashとZshの歴史

Bash の誕生

Bashは1989年にBrian Fox氏がGNUプロジェクトの一環として開発しました。sh(Bourne Shell)の後継として設計され、その名前は「Bourne Again SHell」の頭文字です。Linuxのデフォルトシェルとして長年採用されており、シェルスクリプトの事実上の標準です。

Zsh の誕生

Zshは1990年にPaul Falstad氏がPrinceton大学在学中に開発しました。Bashやcshなどのシェルのベストプラクティスを取り込み、インタラクティブな使い勝手を重視した設計が特徴です。2019年にAppleがmacOSのデフォルトシェルをBashからZshに切り替えたことで、広く注目されるようになりました。


主要な違いを徹底比較

1. 補完機能

シェルを選ぶ際の最大の理由のひとつが補完の質です。

Bash

# Tab で補完(基本的な補完)
ls Do[Tab]  # → Documents/

# bash-completion パッケージで強化できる
sudo apt install bash-completion

# それでも補完候補の表示はシンプル
git [Tab][Tab]
# add  bisect  branch  checkout  clone  ...(横並びリスト)

Zsh

# Tab で補完候補をメニュー形式で表示・カーソルで選択できる
git [Tab]
# ┌─────────────────────────────────┐
# │ add      -- add file contents   │
# │ bisect   -- binary search       │
# │ branch   -- list branches       │
# └─────────────────────────────────┘

# コマンドの引数・オプションの説明も表示
kill [Tab]
# プロセス名と PID をリスト表示

# パスの途中を補完(曖昧補完)
cd /u/lo/b[Tab]  # → /usr/local/bin/

# 大文字小文字を無視した補完
setopt CASE_INSENSITIVE
cd doc[Tab]  # → Documents/

# 誤字を修正して補完(スペルチェック)
setopt CORRECT
sl  # → zsh: correct 'sl' to 'ls' [nyae]?

Zshの補完は zstyle で細かく制御でき、カスタマイズの幅が非常に広いです。


2. プロンプトカスタマイズ

Bash

# .bashrc でプロンプトを設定(PS1変数)
PS1='\u@\h:\w\$ '
# → user@hostname:~/Documents$

# 色を付けるには ANSIエスケープコードを使う(やや冗長)
PS1='\[\e[32m\]\u@\h\[\e[0m\]:\[\e[34m\]\w\[\e[0m\]\$ '

# Git ブランチを表示するには自前でスクリプトを書く必要がある
parse_git_branch() {
  git branch 2>/dev/null | grep '\*' | sed 's/\* //'
}
PS1='\u@\h:\w $( parse_git_branch)\$ '

Zsh

# .zshrc でプロンプトを設定(PROMPT変数)
PROMPT='%n@%m:%~%# '

# 色付けが簡潔に書ける
PROMPT='%F{green}%n@%m%f:%F{blue}%~%f%# '

# 右プロンプト(RPROMPT)が使える
RPROMPT='%F{yellow}$(git_branch)%f'

# promptinit で組み込みテーマを使える
autoload -U promptinit && promptinit
prompt adam1  # 組み込みテーマを適用

さらに Starship(後述)を使えばBash・Zshどちらでも高機能なプロンプトを簡単に設定できます。


3. 設定ファイル

Bash の設定ファイル

~/.bashrc          # インタラクティブシェル用(bash起動時に読み込まれる)
~/.bash_profile    # ログインシェル用(ログイン時に読み込まれる)
~/.bash_logout     # ログアウト時に実行
~/.bash_history    # コマンド履歴
/etc/bash.bashrc   # システム全体の設定
# .bashrc の典型的な内容
export PATH="$HOME/.local/bin:$PATH"
export EDITOR="vim"

alias ll='ls -alF'
alias la='ls -A'
alias gs='git status'

# bash-completion の読み込み
[ -f /usr/share/bash-completion/bash_completion ] && \
  . /usr/share/bash-completion/bash_completion

Zsh の設定ファイル

~/.zshenv          # 常に読み込まれる(最初に)
~/.zprofile        # ログインシェル用(.bash_profile相当)
~/.zshrc           # インタラクティブシェル用(.bashrc相当)
~/.zlogin          # ログインシェル用(.zprofileの後)
~/.zlogout         # ログアウト時
~/.zsh_history     # コマンド履歴
/etc/zshrc         # システム全体の設定
# .zshrc の典型的な内容
export PATH="$HOME/.local/bin:$PATH"
export EDITOR="nvim"

alias ll='ls -alF'
alias la='ls -A'
alias gs='git status'

# Zsh 独自の設定
setopt AUTO_CD           # ディレクトリ名だけで cd
setopt HIST_IGNORE_DUPS  # 重複する履歴を記録しない
setopt SHARE_HISTORY     # 複数端末で履歴を共有

# 補完の有効化
autoload -U compinit && compinit

4. 履歴管理

Bash

# 履歴の設定
HISTSIZE=1000       # メモリ上の履歴件数
HISTFILESIZE=2000   # ファイルへの保存件数
HISTCONTROL=ignoredups  # 重複を記録しない

# 複数端末で履歴を共有(手動設定が必要)
export PROMPT_COMMAND='history -a'
shopt -s histappend  # 履歴をファイルに追記

# Ctrl+R で逆方向インクリメンタル検索

Zsh

# 履歴の設定
HISTSIZE=50000
SAVEHIST=50000
HISTFILE=~/.zsh_history

setopt HIST_IGNORE_DUPS      # 重複を記録しない
setopt HIST_IGNORE_ALL_DUPS  # 全重複を削除
setopt HIST_FIND_NO_DUPS     # 検索時に重複を表示しない
setopt SHARE_HISTORY          # 複数端末で自動共有
setopt HIST_VERIFY            # 履歴展開を即実行しない

# Ctrl+R での検索に加えて、入力中に上下キーで絞り込める
bindkey '^[[A' history-search-backward
bindkey '^[[B' history-search-forward

5. グロブ展開(ファイルパターンマッチ)

Zshのグロブはより強力で、findコマンドの代替になることも多いです。

Bash

# 基本的なグロブ
ls *.txt
ls file{1,2,3}.txt

# extglob を有効にして拡張パターンを使う
shopt -s extglob
ls !(*.log)          # .log 以外
ls +(*.txt|*.md)     # .txt か .md

Zsh

# 再帰的なグロブ(** が使える)
ls **/*.txt          # サブディレクトリも含めてすべての .txt
ls **/*.py(.)        # . で通常ファイルのみ

# グロブ修飾子
ls *(.)              # 通常ファイルのみ
ls *(/)              # ディレクトリのみ
ls *(Om)             # 更新日時の古い順
ls *(L+1M)           # 1MB 以上のファイル
ls *(.mh-24)         # 24時間以内に変更されたファイル

# 否定グロブ(setopt EXTENDED_GLOB が必要)
setopt EXTENDED_GLOB
ls ^*.log            # .log 以外
ls *.txt~file2.txt   # file2.txt を除いた .txt

6. 配列と連想配列

Bash

# 配列
arr=(apple banana cherry)
echo ${arr[0]}      # → apple(0始まり)
echo ${arr[@]}      # 全要素
echo ${#arr[@]}     # 要素数

# 連想配列(Bash 4.0以降)
declare -A map
map[key]="value"
echo ${map[key]}

Zsh

# 配列(1始まり!Bash と異なる)
arr=(apple banana cherry)
echo $arr[1]        # → apple(1始まり)
echo $arr           # 全要素
echo $#arr          # 要素数

# 連想配列
typeset -A map
map[key]="value"
echo $map[key]

# 配列操作が直感的
echo $arr[2,-1]     # 2番目から最後まで
echo ${arr:gs/a/A/} # 全要素に置換を適用

⚠️ 配列のインデックスがBashは0始まり、Zshは1始まりという重要な違いがあります。スクリプトを移植する際に注意が必要です。


7. スクリプト互換性

# シバン(shebang)の違い
#!/bin/bash   # Bash を明示的に使用
#!/bin/zsh    # Zsh を明示的に使用
#!/bin/sh     # POSIX sh(どちらでも動く最大公約数)
  • BashスクリプトはZshでほぼ動くが、配列インデックス・一部の挙動が異なります
  • ZshスクリプトはBashでは動かないことが多いです
  • CI/CD環境・本番サーバーのスクリプトは #!/bin/bash#!/bin/sh が安全です
  • インタラクティブなシェルとスクリプトは別物として考えましょう

8. 速度・パフォーマンス

素の起動速度はBashの方がわずかに速いですが、通常の利用では体感できる差はありません。

# 起動速度を計測
time bash -i -c exit
time zsh -i -c exit

Zshはプラグインや設定が増えると起動が遅くなります。遅延読み込みで対策できます。

# zsh-defer で遅延読み込み
zinit light romkatv/zsh-defer
zsh-defer source ~/.zshrc_heavy_stuff

プラグイン・フレームワーク比較

Bash のプラグイン管理

Bashには公式のプラグインマネージャはなく、手動で設定するか bash-it 等を使います。

# bash-it のインストール
git clone https://github.com/Bash-it/bash-it.git ~/.bash_it
~/.bash_it/install.sh

Zsh のプラグインエコシステム

Zshは豊富なフレームワーク・プラグインマネージャがあります。

ツール特徴
Oh My Zsh最もポピュラー・豊富なテーマとプラグイン・初心者向け
Zinit高速・遅延読み込み対応・上級者向け
AntigenOh My Zshプラグインをシンプルに管理
PreztoOh My Zshより軽量・高速
Zplug柔軟な設定が可能

Oh My Zsh のインストールと基本設定

# インストール
sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
# .zshrc での設定
export ZSH="$HOME/.oh-my-zsh"

ZSH_THEME="agnoster"  # テーマ設定

# プラグインの有効化
plugins=(
  git           # git エイリアスと補完
  docker        # docker 補完
  kubectl       # kubectl 補完
  z             # よく使うディレクトリに素早く移動
  zsh-autosuggestions    # 履歴ベースのコマンド候補表示
  zsh-syntax-highlighting # シンタックスハイライト
)

source $ZSH/oh-my-zsh.sh

特に便利なZshプラグイン

# zsh-autosuggestions:コマンドを入力中に履歴から候補を薄く表示
# → 右矢印キーで補完

# zsh-syntax-highlighting:入力中にコマンドを色分け
# → 有効なコマンドは緑、無効なコマンドは赤

# z / zoxide:cd履歴をもとに曖昧なパス指定でジャンプ
z proj   # → /home/user/work/projects に移動

# fzf との統合:Ctrl+R で高速な履歴検索
[ -f ~/.fzf.zsh ] && source ~/.fzf.zsh

Starship:どちらでも使えるモダンなプロンプト

BashでもZshでも(さらにFish・PowerShellでも)使えるRust製の高速プロンプトです。

# インストール
curl -sS https://starship.rs/install.sh | sh

# Bash に追加(.bashrc)
eval "$(starship init bash)"

# Zsh に追加(.zshrc)
eval "$(starship init zsh)"
# ~/.config/starship.toml

[character]

success_symbol = “[❯](bold green)” error_symbol = “[❯](bold red)”

[git_branch]

symbol = ” “

[python]

symbol = ” “

[nodejs]

symbol = ” “

Starshipを使えばプロンプトの見た目はBash・Zsh間で差がなくなります。


ユースケース別おすすめ

Bash が向いている場合

サーバー管理・インフラ作業メイン ほぼすべてのLinuxサーバーにBashがインストールされています。どの環境でも同じシェルを使いたいなら、Bashが現実的です。

シェルスクリプト開発がメイン CI/CD・自動化スクリプトの標準は #!/bin/bash です。スクリプトと日常シェルを統一したい場合はBashが合っています。

環境を選ばず使いたい コンテナ内・クラウドシェル・社内の様々なサーバーなど、シェルをインストールできない環境でも動作します。

チームでの共有スクリプト チームメンバーがBashに慣れている場合、Zsh固有の機能を使ったスクリプトは混乱の元になります。


Zsh が向いている場合

日常のターミナル操作を快適にしたい 補完・履歴・プロンプトなど、インタラクティブな使い勝手はZshが圧倒的に優れています。毎日多くの時間をターミナルで過ごすなら投資する価値があります。

macOSユーザー macOS Catalina以降のデフォルトがZshです。Homebrewや開発ツールのドキュメントもZshを前提にしているものが増えています。

補完・候補表示を重視する gitdockerkubectl など複雑なCLIを使う場合、Zshの補完は作業効率を大きく高めます。

プロンプトをカスタマイズしたい Git ブランチ・現在の言語バージョン・実行時間などを表示するリッチなプロンプトを手軽に実現できます。


インストール方法

Bash のインストール・確認

# バージョン確認
bash --version

# Ubuntu / Debian(通常プリインストール済み)
sudo apt install bash

# macOS(Homebrewで最新版を入れる場合)
brew install bash
# デフォルトシェルとして設定
sudo bash -c 'echo /opt/homebrew/bin/bash >> /etc/shells'
chsh -s /opt/homebrew/bin/bash

Zsh のインストール

# Ubuntu / Debian
sudo apt install zsh

# macOS(プリインストール済みだが Homebrew 版の方が新しい)
brew install zsh

# RHEL / CentOS / Fedora
sudo dnf install zsh

# Alpine Linux
apk add zsh

# バージョン確認
zsh --version

# デフォルトシェルとして設定
chsh -s $(which zsh)
# → ターミナルを再起動して反映

BashからZshへの移行手順

ステップ1:現在の設定をバックアップ

cp ~/.bashrc ~/.bashrc.bak
cp ~/.bash_profile ~/.bash_profile.bak 2>/dev/null || true

ステップ2:Zshをインストールしてデフォルトシェルに設定

sudo apt install zsh       # Ubuntu の場合
chsh -s $(which zsh)

ターミナルを再起動すると Zsh の初期設定ウィザードが表示されます。

ステップ3:既存の .bashrc を .zshrc に移植

BashとZshの設定の多くはそのまま使えます。

# .zshrc に以下をコピー(基本的にそのまま動く)
export PATH="$HOME/.local/bin:$PATH"
export EDITOR="vim"
alias ll='ls -alF'
alias gs='git status'

# Bash固有の設定は書き換えが必要
# ❌ shopt -s extglob  →  ✅ setopt EXTENDED_GLOB
# ❌ HISTCONTROL=ignoredups  →  ✅ setopt HIST_IGNORE_DUPS

主な変換対応表

BashZsh
shopt -s cdspellsetopt CORRECT
shopt -s autocdsetopt AUTO_CD
HISTCONTROL=ignoredupssetopt HIST_IGNORE_DUPS
shopt -s globstarsetopt GLOB_STAR_SHORT
complete -F _git gitcompdef _git git
export PS1='...'export PROMPT='...'

ステップ4:Oh My Zsh のインストール(任意)

sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"

ステップ5:便利プラグインの追加

# zsh-autosuggestions
git clone https://github.com/zsh-users/zsh-autosuggestions \
  ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions

# zsh-syntax-highlighting
git clone https://github.com/zsh-users/zsh-syntax-highlighting \
  ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting

# .zshrc の plugins に追加
plugins=(git zsh-autosuggestions zsh-syntax-highlighting)

ステップ6:動作確認

# よく使うコマンドが動くか確認
echo $0        # → zsh
echo $SHELL    # → /bin/zsh または /usr/bin/zsh

# 補完が動くか確認
git [Tab]
docker [Tab]

どちらも使う:シェルの使い分け戦略

多くのエンジニアは「日常使いはZsh、スクリプトはBash(またはsh)」という使い分けをしています。

#!/bin/bash
# 本番スクリプト・CI/CD は bash で書く
# → どの環境でも動く保証がある
set -euo pipefail

deploy() {
  echo "Deploying..."
}
deploy
# 日常のターミナルは zsh を使う
# → 補完・プロンプト・プラグインを快適に活用

インタラクティブシェルとスクリプトシェルを分けて考えることで、両方の良いとこ取りができます。


よくある質問(FAQ)

Q1. macOS でデフォルトが Zsh になったのはなぜですか?

Bashのライセンス問題が主な理由です。macOSに同梱されていたBashはGPLv2の古いバージョン(3.2)で、GPLv3のBash 4.x以降はAppleが採用しませんでした。ZshはMIT/BSD系ライセンスのため、Appleがデフォルトに採用しやすかったという背景があります。

Q2. .bashrc と .bash_profile の違いは?

.bash_profile はログインシェル(SSHログイン・ターミナルアプリ起動時など)に読み込まれます。.bashrc はインタラクティブな非ログインシェル(既存の端末でbashを起動した場合等)に読み込まれます。混乱しやすいため、多くのユーザーは .bash_profile から .bashrc を呼び出すことで統一しています。

# .bash_profile
[ -f ~/.bashrc ] && source ~/.bashrc

Zshでは .zshrc が通常のインタラクティブシェルで読み込まれ、.zprofile がログインシェル用です。

Q3. Oh My Zsh は重くないですか?

プラグインを入れすぎると起動が遅くなります。使わないプラグインは外し、必要なものだけ有効にするのが基本です。速度を重視するなら Zinit(遅延読み込み対応)や Prezto の方が向いています。

# 起動時間を計測
time zsh -i -c exit

# プロファイリング
zsh -i -c 'zprof' 2>&1 | head -20

Q4. Fish シェルはどうですか?

FishはZshよりさらにユーザーフレンドリーで、設定なしで補完・シンタックスハイライトが動きます。ただし、POSIX非互換のため .bashrc の設定が流用できず、学習コストが高いです。「BashやZshの知識を活かしながら快適にしたい」場合はZsh、「ゼロから始めてとにかく快適にしたい」場合はFishが向いています。

Q5. スクリプトを Zsh で書いてもいいですか?

個人利用や特定の環境に限定されるスクリプトなら問題ありません。ただし、複数人が使うスクリプト・CI/CD・サーバーへのデプロイスクリプトは #!/bin/bash#!/bin/sh で書くのが安全です。Zshがインストールされていない環境では動作しないためです。

Q6. Windows で Bash や Zsh を使うには?

WSL(Windows Subsystem for Linux):本格的なLinux環境
Git Bash:軽量なBash環境
MSYS2 / Cygwin:Unix互換環境

WSL2 を使えばUbuntu上でBash/Zshをネイティブ同様に使えます。

Q7. Zsh に移行したら元に戻せますか?

いつでも戻せます。

# Bash に戻す
chsh -s $(which bash)

設定ファイルは独立しているため、.bashrc はそのまま残っています。


機能比較まとめ表

機能BashZsh
デフォルト搭載(Linux)ほぼ全環境一部のみ
デフォルト搭載(macOS)❌(Catalina以降)
補完機能基本的非常に強力
メニュー式補完❌(bash-completionで部分対応)
右プロンプト(RPROMPT)
共有履歴(複数端末)手動設定setopt SHARE_HISTORY
再帰グロブ(**shopt -s globstar が必要標準
スペル修正shopt -s cdspell(cdのみ)setopt CORRECT(全コマンド)
連想配列Bash 4.0以降標準
配列インデックス0始まり1始まり
プラグインエコシステム限定的非常に豊富
POSIX互換高い高い(ただし差異あり)
スクリプト標準✅ 業界標準△(環境依存)
設定ファイル.bashrc / .bash_profile.zshrc / .zprofile
学習コスト低いやや高い

まとめ

BashとZshはどちらも優れたシェルで、「どちらが正解」という答えはありません。

Bash を選ぶ理由

  • サーバー管理・スクリプト開発がメイン
  • どの環境でも同じシェルを使いたい
  • シンプルさを重視する

Zsh を選ぶ理由

  • 日常のターミナル操作を快適にしたい
  • 補完・プロンプトにこだわりたい
  • macOSがメイン
  • プラグインエコシステムを活用したい

迷っているならまず Zshをインストールして既存の .bashrc の内容を .zshrc にコピーするだけ試してみることをおすすめします。補完の違いは即座に体感でき、移行コストも思ったより低いです。スクリプトは引き続き #!/bin/bash で書く「インタラクティブはZsh・スクリプトはBash」の使い分けが、多くのエンジニアにとって現実的な落としどころです。


参考リンク

公式

フレームワーク・ツール

  • Oh My Zsh – 最もポピュラーなZshフレームワーク
  • Zinit – 高速プラグインマネージャ
  • Starship – クロスシェル対応のモダンプロンプト
  • zsh-autosuggestions – 履歴ベースの候補表示
  • zsh-syntax-highlighting – シンタックスハイライト
  • fzf – 高速ファジーファインダー

関連記事(本サイト)


本記事は2026年6月時点の情報をもとに作成しています。Bash 5.2・Zsh 5.9 での動作を前提としています。各ツールのバージョンアップにより挙動が変わる場合があるため、最新情報は各公式ドキュメントをご確認ください。