この記事では 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. コマンド補完機能
bash | zsh |
---|---|
基本的なタブ補完機能を持つ | より高度で柔軟な補完システム |
補完候補が複数ある場合は二度タブを押す必要がある | 補完候補をインタラクティブに選択可能 |
大文字・小文字を区別する | 曖昧な補完や誤字訂正機能を持つ |
- | 大文字・小文字を区別しない設定が容易 |
# zshの補完例
cd /u/l/b[TAB] # 自動的に /usr/local/bin に展開される
2. グロビング(パターンマッチング)
bash | zsh |
---|---|
基本的なワイルドカード(*, ?)をサポート | デフォルトで拡張グロビングが有効 |
拡張パターンマッチングには shopt -s extglob が必要 |
再帰的なパターンマッチングが可能 |
- | より柔軟な数値範囲指定が可能 |
# zshでの再帰的なファイル検索
ls **/*.txt # すべてのサブディレクトリを含む .txt ファイル
# 数値範囲指定
echo {1..10} # bashでも可能
echo {01..10} # zshでは01, 02, ...と0埋め表示が可能
3. ヒストリ管理
bash | zsh |
---|---|
基本的なコマンド履歴機能 | 共有ヒストリ(複数の端末間でヒストリを共有可能) |
.bash_history ファイルに保存 |
タイムスタンプの保存 |
- | より高度な検索機能 |
# zshでのヒストリ検索例
history -i # タイムスタンプ付きで表示
4. プロンプトのカスタマイズ
bash | zsh |
---|---|
PS1 変数による基本的なカスタマイズ |
より柔軟なプロンプト設定システム |
色やスペシャル文字の使用には特殊なエスケープシーケンスが必要 | プロンプト拡張機能(右側プロンプト、複数行プロンプトなど) |
- | 組み込みの色名変数 |
- | テーマシステム(Oh My Zshなど) |
5. プラグインとフレームワーク
bash | zsh |
---|---|
基本的なプラグイン機構は存在しない | 強力なプラグインシステム |
拡張は主に .bashrc に関数やエイリアスを追加する形で行う |
Oh My Zsh, Prezto, Zinit などの人気フレームワーク |
- | 数千のプラグインとテーマが利用可能 |
6. スクリプト互換性
bash | zsh |
---|---|
シェルスクリプトの事実上の標準 | 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への移行方法
- zshのインストール
# Debian/Ubuntu
sudo apt install zsh
# CentOS/RHEL
sudo yum install zsh
# macOS (Homebrew)
brew install zsh
- デフォルトシェルの変更
# ユーザーのデフォルトシェルを変更
chsh -s $(which zsh)
- 設定の移行
# 基本的なbash設定をzshに移植
grep "^alias\|^export" ~/.bashrc >> ~/.zshrc
シェルスクリプトの互換性に関する注意点
bashとzshは多くの共通点がありますが、高度な機能を使用する場合は互換性の問題が発生する可能性があります。
シェルスクリプトを書く際に意識すべきことをまとめます。
- スクリプトの先頭に明示的なシェバン(
#!/bin/bash
または#!/bin/zsh
)を記述 - 広い互換性が必要なスクリプトはbashまたはPOSIX shを使用
- zsh固有の機能を使う場合は、スクリプト内で明確にコメントする
(例)
#!/bin/bash
# このスクリプトはbashで実行することを想定しています
# bashの拡張機能を有効化
shopt -s extglob
# スクリプト本体
おわりに
bashとzshはどちらも優れたシェルですが、それぞれ異なる長所と用途があります。
個人の作業環境にはzshの高度な機能が便利ですが、サーバー環境やシェルスクリプト開発では依然としてbashが重要な役割を果たしています。
自分の用途や優先事項に合わせて選択することをお勧めします。
最終的には両方のシェルに親しんでおくことで、どんな環境でも効率的に作業できるようになるでしょう。
コメント