【今更】 bash と zsh の違いについて網羅的にメモ

  • UNIX
  • bash
  • zsh

この記事では bash と zsh の主な違い、それぞれの特徴、移行するメリット、そして基本的な設定方法について解説します。

Linux や macOS などの UNIX 系 OS を使う上で、ターミナルとシェルは不可欠な存在です。

特に「bash(Bourne Again SHell)」と「zsh(Z Shell)」は、現代のシステム管理者やデベロッパーに広く使われている2大シェルです。

bashとzshの基本情報

基本情報比較

項目bash(Bourne Again SHell)zsh(Z Shell)
開発Brian Fox氏によって1989年に開発されたGNUプロジェクトの一部Paul Falstad氏によって1990年に開発
標準採用多くのLinuxディストリビューションで長年デフォルトシェルとして採用macOS Catalina(2019年)以降のデフォルトシェル
互換性Bourne Shell(sh)の上位互換として設計bash、ksh、tcshの機能を取り入れた拡張シェル
特徴安定性と広い互換性を重視高い拡張性とカスタマイズ性を持つ

1. コマンド補完機能

bashzsh
基本的なタブ補完機能を持つより高度で柔軟な補完システム
補完候補が複数ある場合は二度タブを押す必要がある補完候補をインタラクティブに選択可能
大文字・小文字を区別する曖昧な補完や誤字訂正機能を持つ
-大文字・小文字を区別しない設定が容易
# zshの補完例
cd /u/l/b[TAB]  # 自動的に /usr/local/bin に展開される

2. グロビング(パターンマッチング)

bashzsh
基本的なワイルドカード(*, ?)をサポートデフォルトで拡張グロビングが有効
拡張パターンマッチングには shopt -s extglob が必要再帰的なパターンマッチングが可能
-より柔軟な数値範囲指定が可能
# zshでの再帰的なファイル検索
ls **/*.txt  # すべてのサブディレクトリを含む .txt ファイル

# 数値範囲指定
echo {1..10}    # bashでも可能
echo {01..10}   # zshでは01, 02, ...と0埋め表示が可能

3. ヒストリ管理

bashzsh
基本的なコマンド履歴機能共有ヒストリ(複数の端末間でヒストリを共有可能)
.bash_history ファイルに保存タイムスタンプの保存
-より高度な検索機能
# zshでのヒストリ検索例
history -i  # タイムスタンプ付きで表示

4. プロンプトのカスタマイズ

bashzsh
PS1変数による基本的なカスタマイズより柔軟なプロンプト設定システム
色やスペシャル文字の使用には特殊なエスケープシーケンスが必要プロンプト拡張機能(右側プロンプト、複数行プロンプトなど)
-組み込みの色名変数
-テーマシステム(Oh My Zshなど)

5. プラグインとフレームワーク

bashzsh
基本的なプラグイン機構は存在しない強力なプラグインシステム
拡張は主に .bashrc に関数やエイリアスを追加する形で行うOh My Zsh, Prezto, Zinit などの人気フレームワーク
-数千のプラグインとテーマが利用可能

6. スクリプト互換性

bashzsh
シェルスクリプトの事実上の標準bash との高い互換性を持つ
最も広く使われ、多くのスクリプトが bash を前提に書かれている一部の高度な機能は bash と互換性がない場合がある
-emulate bash コマンドによる互換モードがある

選択の基準

zsh に移行するメリットbash を選ぶ理由
生産性向上:
・より強力な補完機能
・高度なファイル操作
・効率的なヒストリ管理
広い互換性:
・ほぼすべてのUnix/Linux環境で利用可能
・スクリプトの互換性が高い
カスタマイズ性:
・見た目と使い勝手の広範なカスタマイズ
・豊富なプラグインエコシステム
シンプルさ:
・学習曲線がなだらか
・基本的な機能で十分な場合が多い
ユーザーフレンドリー:
・より直感的な操作感
・ミスに対する寛容性(typoの自動修正など)
デフォルト環境:
・多くのサーバー環境でデフォルト
・リモート接続時のシェル環境の一貫性
macOSとの整合性:
・macOS Catalina以降のデフォルトシェル
・Appleの公式サポート
-

基本設定方法

bash の設定

主要な設定ファイル

ファイル読み込まれるタイミング
~/.bash_profileログイン時
~/.bashrc新しいシェルを開くたび

基本的な設定例

# ~/.bashrc
# エイリアス設定
alias ll='ls -la'
alias grep='grep --color=auto'

# ヒストリ設定
HISTSIZE=10000
HISTFILESIZE=20000
HISTCONTROL=ignoreboth

# プロンプト設定
PS1='\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '

# パス設定
export PATH="$HOME/bin:$PATH"

zsh の設定

主要な設定ファイル

ファイル読み込まれるタイミング
~/.zshrc新しいシェルを開くたび
~/.zshenvすべてのzshセッション
~/.zprofileログイン時

基本的な設定例

# ~/.zshrc
# 基本設定
setopt autocd              # cdコマンドなしでディレクトリ変更
setopt interactive_comments # コマンドラインでコメントを使用可能に

# 補完設定
autoload -Uz compinit
compinit
zstyle ':completion:*' matcher-list 'm:{a-z}={A-Z}'  # 大文字小文字を区別しない

# ヒストリ設定
HISTFILE=~/.zsh_history
HISTSIZE=10000
SAVEHIST=10000
setopt share_history       # 複数の端末間でヒストリを共有
setopt hist_ignore_all_dups # 重複コマンドを履歴に残さない

# プロンプト設定
autoload -Uz promptinit
promptinit
prompt adam1

# エイリアス
alias ls='ls --color=auto'
alias ll='ls -la'

bashからzshへの移行方法

  1. zshのインストール
# Debian/Ubuntu
sudo apt install zsh

# CentOS/RHEL
sudo yum install zsh

# macOS (Homebrew)
brew install zsh
  1. デフォルトシェルの変更
# ユーザーのデフォルトシェルを変更
chsh -s $(which zsh)
  1. 設定の移行
# 基本的なbash設定をzshに移植
grep "^alias\|^export" ~/.bashrc >> ~/.zshrc

シェルスクリプトの互換性に関する注意点

bashとzshは多くの共通点がありますが、高度な機能を使用する場合は互換性の問題が発生する可能性があります。

Sponsored

シェルスクリプトを書く際に意識すべきことをまとめます。

  1. スクリプトの先頭に明示的なシェバン(#!/bin/bashまたは#!/bin/zsh)を記述
  2. 広い互換性が必要なスクリプトはbashまたはPOSIX shを使用
  3. zsh固有の機能を使う場合は、スクリプト内で明確にコメントする

Sponsored

(例)

#!/bin/bash
# このスクリプトはbashで実行することを想定しています

# bashの拡張機能を有効化
shopt -s extglob

# スクリプト本体

おわりに

bashとzshはどちらも優れたシェルですが、それぞれ異なる長所と用途があります。

個人の作業環境にはzshの高度な機能が便利ですが、サーバー環境やシェルスクリプト開発では依然としてbashが重要な役割を果たしています。

自分の用途や優先事項に合わせて選択することをお勧めします。

両方のシェルに親しんでおくと、環境が変わっても作業しやすくなります。