はじめに
普段エンジニアとして毎日のように触っているターミナルですが、意外とよくわかっていなかったので深堀ってみました。
ターミナルとは
ターミナルとは、文字でコンピュータを操作するテキストベースのインターフェースです。
GUI(マウス操作)とは違い、すべて文字で操作します。
[ファイル操作・プログラム実行・サーバ接続]など、OSの機能を直接扱えるのが特徴です。
キーボード入力 → コマンド実行 → 結果表示といった流れで使用されます。
ターミナルはあくまで「入出力の箱(インターフェース)」であり、実際にコマンドを解釈して実行するのは「シェル」です(例:bash, zsh)
[人間] → [ターミナルエミュレータ(後述)] → [シェル] → [OS]
昔は物理デバイスでしたが、今はソフト(ターミナルアプリ)が主流です。
物理デバイスの頃のターミナル: Wikipediaより
現代のターミナル=エミュレータ
エミュレータとは
エミュレータ(emulator)とは、ある環境(ハード・OS・デバイス)の動作を別の環境で再現するソフトウェアのことです。
本来その機械がないと動かないものを、別の環境で“動いているように見せる”
つまり、現在使われているターミナルは、正確には'ターミナル'ではなく昔の物理端末をソフトウェアで再現した'ターミナルエミュレータ'です。
PTY(仮想端末)とは
PTYは「Pseudo Terminal」の略です。(pseudoは偽物・擬似的という意味)
正確には「Pseudo Teletype(擬似テレタイプ)」→ 「Pseudo TTY」から略されています。
実体のないソフトウェア上のターミナルのことを指します。
TTY(Teletype)
→ 昔の物理端末(キーボード+画面)
つまり仮想端末(PTY)とは、ソフトウェアで作られた「偽物のTTY」のことです。
なぜPTYが必要か
昔は以下のような流れでした。
[キーボード + 画面(物理機器)]
↓
TTY(実体のある端末)
↓
シェル
歴史的に「端末経由で操作するのが前提だった」ため、アプリはTTY前提で設計されました。
現代では物理TTYがないため、アプリに変更を加えずに動かすためにはPTYが必要になります。
現在はこのような流れになっています。
入力(キーボード)
↓
ターミナルエミュレータ(Warp / iTerm2 / Ghostty / VSCode)
↓(PTY master)エミュレータ側
======================= (OSが2つをつなぐ)
↓(PTY slave)シェル側
シェル(bash / zsh)
↓
アプリ(ls / vim / top / Claude Code など)
TUIとは
TUI(Text User Interface) とは、ターミナル上で動く文字ベースUIのことです。
最近話題のClaude CodeがまさにTUIのわかりやすい例です。
せっかくなので、TUIおよびCLIとGUIとの違いについて解説してもらいました。
ターミナルマルチプレクサとは
ターミナルマルチプレクサ(terminal multiplexer) とは、1つのターミナル上で複数の仮想ターミナル(セッション)を同時に扱えるソフトウェアです。
「multiplexer」には、
・多重化するもの(many → one)
・複数を1つにまとめて選択する仕組み
といった意味があります。
ソフトウェアをインストール後、ターミナルエミュレータ内でコマンドを実行することで動作します。
Terminal Emulator(iTerm2 / WezTerm / Ghostty など)
↓
Shell(bash / zsh)
↓
マルチプレクサ(tmux / zellij)
↓
複数のシェル / アプリ (プロセス)
ターミナルマルチプレクサには、2つの大きな役割があります
1. セッションの保持 →メイン
2. 画面分割(ペイン・ウィンドウ)
1. セッションの保持
「セッションの保持」とは、ターミナルを閉じても作業中のプロセスや画面状態が残るようにすることです。
通常のターミナルは終了すると同時にプロセスも終了します。
SSH切断やPCスリープでも作業を再開できるため、サーバ運用・長時間処理では必須の機能となっています。
セッション保持の本質
通常のターミナル(エミュレータ)のみの場合:
Terminal Emulator(iTerm2 / WezTerm / Ghostty など)
↓
PTY(接続)
↓
Shell(bash / zsh)
↓
プロセス
ターミナルを閉じる → PTYが消える → Shellが死ぬ → プロセスも死ぬ
なぜならプロセスが「そのターミナル(TTY=PTY)」に紐づいているためです。
一方で、マルチプレクサを使った場合:
Terminal Emulator(iTerm2 / WezTerm / Ghostty など)
↓
PTY(接続)
↓
Shell(bash / zsh)
↓
マルチプレクサ(tmux / zellij)→(バックグラウンド常駐プロセス)
↓
複数のPTY(接続)
↓
複数のShell(bash / zsh)
↓
複数のプロセス
この場合、実際のターミナルではなくマルチプレクサが各プロセスに紐づくTTY(=PTY)を持っているため、ターミナル(エミュレータ)のPTYが切れてもマルチプレクサがバックグラウンドで生き続けている限りプロセスは動き続けます。
2. 画面分割(ペイン・ウィンドウ)
現在は多くのターミナルエミュレータが独自の画面分割機能を備えているため、こちらの役割をメインの理由として導入する機会は減っていると思います
1つのターミナル内で画面を分割して並べて表示することができるようになります。
わかりやすく画像で説明すると、、
普通:ターミナル1つ=作業1つ
マルチプレクサ:ターミナル1つ=作業を何個も同時に
ペイン = 画面内の分割された領域(最小単位)
ウィンドウ = ペインをまとめた1つの画面単位
※画像はイメージです
全体構造
ペインは同時表示、ウィンドウは切り替え表示といったイメージです。
Session(セッション)
├─ Window(ウィンドウ)
│ ├─ Pane(ペイン)
│ ├─ Pane
│ └─ Pane
└─ Window
├─ Pane
└─ Pane
代表的なターミナルマルチプレクサ
さいごにChatGptにお願いして、最も使用されている2つの代表的なマルチプレクサであるtmuxとzellijの特徴を比較し表にしました。
マルチプレクサを導入する際に少しでも参考になればと思います。
| 比較項目 | tmux | zellij |
|---|---|---|
| [基本情報] | ||
| 思想 | Unix哲学(最小・組み合わせ) | モダンUX(全部入り) |
| 実装言語 | C | Rust |
| アーキテクチャ | client-server(socket) | 単一プロセス + async |
| 設計タイプ | ツール(部品) | アプリ(完成品) |
| [構造・モデル] | ||
| 階層構造 | session → window → pane | session → tab → pane |
| セッション管理 | 強力(detach/attach安定) | あり(やや弱い) |
| ペイン操作 | CLIベース | UI + モード |
| レイアウト | 手動中心 | 自動レイアウトあり |
| フローティング | なし | あり |
| [操作・UX] | ||
| 操作方式 | prefixキー | モード切替 |
| 初期設定 | ユーザーによるカスタマイズ前提のため最小限 (設定ファイルがとにかく難しい) |
ある程度使いやすい状態に設定されている (初心者にやさしい。ショートカットキーの一覧が見やすい) |
| 学習コスト | 高い(2〜4週間) | 低い(数分〜数時間) |
| discoverability | 低い | 高い(UIヒント) |
| 初期体験 | 悪い | 良い |
| キーバインド | 完全カスタム | デフォルト強い |
| [パフォーマンス] | ||
| メモリ使用量 | 約6〜12MB | 約80MB |
| CPU効率 | 非常に高い | 高い(条件付き) |
| 起動速度 | 非常に速い | やや遅い |
| 大量出力 | 強い | やや弱い |
| 並列処理 | 弱い | 強い(Rust async) |
| [リモート・ネットワーク] | ||
| SSH適性 | ◎(最強) | ○(やや不利) |
| 遅延耐性 | 高い | 中程度 |
| セッション維持 | 非常に安定 | 安定(やや弱い) |
| サーバ用途 | 最適 | 非推奨 |
| [拡張性・エコシステム] | ||
| プラグイン数 | 非常に多い | 少ない |
| エコシステム | 成熟(10年以上) | 発展途上 |
| 拡張方式 | shell / script | WebAssembly |
| カスタマイズ性 | 無限 | 制限あり |
| 初期機能 | 少ない | 多い |
| [機能比較] | ||
| セッション共有 | ◎ | ○ |
| スクリプト制御 | ◎ | △ |
| UIステータスバー | △(自作) | ◎(標準) |
| コマンドパネル | ✕ | ◎ |
| マウス操作 | △ | ◎ |
| 自動レイアウト | ✕ | ◎ |
| フローティングペイン | ✕ | ◎ |
| [開発者体験] | ||
| Neovim連携 | ◎ | ○ |
| CLI統合 | ◎ | ○ |
| IDE的体験 | △ | ◎ |
| セットアップ | 難しい | 簡単 |
| dotfiles依存 | 高い | 低い |
| [思想比較(重要)] | ||
| 操作モデル | 記憶型(覚える) | 発見型(見ればわかる) |
| ターゲット | 上級者 | 初心者〜中級者 |
| カスタマイズ | 前提 | 不要でもOK |
| 学習曲線 | 急 | 緩やか |
最終判断(用途別)
| 用途 | 推奨 |
|---|---|
| SSH / 本番サーバ | tmux |
| 軽量環境 | tmux |
| CLI自動化 | tmux |
| ローカル開発 | zellij |
| 初心者 | zellij |
| UI重視 | zellij |



