<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Tui on Tarragon</title><link>https://tarrragon.github.io/blog/tags/tui/</link><description>Recent content in Tui on Tarragon</description><generator>Hugo -- gohugo.io</generator><language>zh-TW</language><copyright>Tarragon (CC BY 4.0)</copyright><lastBuildDate>Thu, 02 Jul 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://tarrragon.github.io/blog/tags/tui/index.xml" rel="self" type="application/rss+xml"/><item><title>CLI 環境工具</title><link>https://tarrragon.github.io/blog/linux/tools/cli/</link><pubDate>Thu, 02 Jul 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/linux/tools/cli/</guid><description>&lt;p>在純文字終端機下做事的工具分兩個家族。第一個是&lt;strong>日常指令的現代替代品&lt;/strong>：&lt;code>grep&lt;/code> / &lt;code>find&lt;/code> / &lt;code>cat&lt;/code> / &lt;code>ls&lt;/code> 這些預設指令的現代版（&lt;code>ripgrep&lt;/code> / &lt;code>fd&lt;/code> / &lt;code>bat&lt;/code> / &lt;code>eza&lt;/code> + 互動式的 &lt;code>fzf&lt;/code>），在每天重複幾十次的搜尋與瀏覽上更快更省力。第二個是&lt;strong>終端機圖形化介面（TUI）&lt;/strong>：用 ASCII 與 Unicode 製圖字元做出的監控、圖表、多視窗、資料庫操作介面，只傳純文字、不依賴影像協定，在 SSH、手機平板、低頻寬連線下最穩。&lt;/p>
&lt;h2 id="日常指令的現代替代品">日常指令的現代替代品&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>&lt;a href="modern-cli-replacements/">現代 CLI 替代工具&lt;/a>&lt;/strong> — &lt;code>grep&lt;/code> → &lt;code>ripgrep&lt;/code>、&lt;code>find&lt;/code> → &lt;code>fd&lt;/code>、&lt;code>cat&lt;/code> → &lt;code>bat&lt;/code>、&lt;code>ls&lt;/code> → &lt;code>eza&lt;/code>，加上互動式模糊搜尋 &lt;code>fzf&lt;/code>。什麼情境值得換、換了要注意什麼、為什麼別在腳本裡依賴它們。&lt;/li>
&lt;/ul>
&lt;h2 id="終端機圖形化介面tui">終端機圖形化介面（TUI）&lt;/h2>
&lt;p>這一類「圖形化」是用製圖字元畫出來的介面，而不是把 PNG／JPG 渲染進終端機，所以傳輸量小、在低頻寬與手機連線下最穩。大致分六類：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>TUI 監控與儀表板&lt;/strong> — &lt;code>btop&lt;/code> / &lt;code>htop&lt;/code> / &lt;code>k9s&lt;/code> / &lt;code>ncdu&lt;/code> 等系統監控的全螢幕互動介面；版控專用的 git 線圖工具（&lt;code>tig&lt;/code> / &lt;code>lazygit&lt;/code> / &lt;code>gitui&lt;/code>）是同類 TUI 但獨立的子題。&lt;/li>
&lt;li>&lt;strong>ASCII 與文字圖表&lt;/strong> — &lt;code>gnuplot&lt;/code> / &lt;code>termgraph&lt;/code> / &lt;code>plotext&lt;/code> 等把資料畫成終端機圖表的工具。&lt;/li>
&lt;li>&lt;strong>終端機多工器&lt;/strong> — &lt;code>tmux&lt;/code> / &lt;code>zellij&lt;/code>，分割畫面、連線斷了 session 還在。&lt;/li>
&lt;li>&lt;strong>檔案管理器&lt;/strong> — &lt;code>broot&lt;/code>（樹狀）/ &lt;code>yazi&lt;/code> / &lt;code>ranger&lt;/code>（Miller 欄狀），像 IDE 側邊欄那樣瀏覽目錄與預覽檔案。&lt;/li>
&lt;li>&lt;strong>SQL 客戶端&lt;/strong> — &lt;code>harlequin&lt;/code>（IDE 風）/ &lt;code>lazysql&lt;/code>（瀏覽器風）/ &lt;code>pgcli&lt;/code>、&lt;code>litecli&lt;/code>（增強 REPL），在終端機連資料庫跑查詢。&lt;/li>
&lt;li>&lt;strong>訊息佇列客戶端&lt;/strong> — Kafka 的 &lt;code>kaskade&lt;/code> / &lt;code>yozefu&lt;/code> / &lt;code>ktea&lt;/code>（全螢幕 TUI）、Redis 的 &lt;code>iredis&lt;/code>（增強 REPL），在終端機連 broker 瀏覽 topic 與訊息。&lt;/li>
&lt;/ul>
&lt;p>這個系列的每篇文章都用實機驗證導向的流程生產（裝起來實跑、TUI 交人互動驗、驗不了的標 caveat）。要擴展新類別時，照 &lt;a href="https://tarrragon.github.io/blog/posts/%E9%A9%97%E8%AD%89%E5%B0%8E%E5%90%91%E7%9A%84-cli-%E5%B7%A5%E5%85%B7%E6%96%87%E7%AB%A0%E5%AE%98%E6%96%B9-docs-%E6%9F%A5%E6%A0%B8%E6%94%BE%E9%81%8E%E7%9A%84%E8%90%BD%E5%B7%AE%E9%A1%9E%E5%9E%8B/" data-link-title="驗證導向的 CLI 工具文章：官方 docs 查核放過的落差類型" data-link-desc="CLI 工具教學的指令正確性不能只靠官方文件查核、要實機驗證時回來。官方文件驗的是「文件說的是否正確」、驗不了「文件沒說的是否存在」。">驗證導向的 CLI 工具文章生產流程&lt;/a> 走。&lt;/p>
&lt;hr>
&lt;h2 id="跟工具選單其他子系列的邊界">跟工具選單其他子系列的邊界&lt;/h2>
&lt;p>CLI 環境工具跟 tools 底下另外兩個子系列的分界：&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>情境&lt;/th>
 &lt;th>該看&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>純終端機下的指令替代與 TUI&lt;/td>
 &lt;td>本系列&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>有圖形環境、要挑桌面 app（檔案管理員、DE）&lt;/td>
 &lt;td>&lt;a href="../gui/">圖形桌面工具&lt;/a>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>遠端操作、把 session 留在遠端不掉&lt;/td>
 &lt;td>&lt;a href="../remote/">遠端工具&lt;/a>（多工器的遠端應用面）&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>多工器（&lt;code>tmux&lt;/code> / &lt;code>zellij&lt;/code>）與檔案瀏覽（&lt;code>broot&lt;/code> / &lt;code>yazi&lt;/code>）這類工具兩邊都會提到：本系列講它們在純終端機下的用法與選型，遠端 / 圖形的情境應用則由 remote / gui 兩系列承接。這些工具的配置檔怎麼版控、跨機器同步，見 &lt;a href="https://tarrragon.github.io/blog/linux/dotfile/" data-link-title="Dotfile 工作環境配置指南" data-link-desc="個人開發環境的配置管理 — dotfile 結構設計、同步策略、shell 與終端機配置、平鋪式視窗管理、桌面客製化，從個人工具鏈延伸到團隊環境標準化">Dotfile 管理&lt;/a> 的&lt;a href="https://tarrragon.github.io/blog/linux/dotfile/03-terminal-ecosystem/" data-link-title="模組三：終端機與編輯器" data-link-desc="終端機相關工具的配置檔散落在不同位置、不確定哪些該進 dotfile repo 時回來讀">終端機與編輯器&lt;/a>模組。&lt;/p>
&lt;hr>
&lt;p>底下自動列出本系列的所有文章、依日期排序。&lt;/p></description><content:encoded><![CDATA[<p>在純文字終端機下做事的工具分兩個家族。第一個是<strong>日常指令的現代替代品</strong>：<code>grep</code> / <code>find</code> / <code>cat</code> / <code>ls</code> 這些預設指令的現代版（<code>ripgrep</code> / <code>fd</code> / <code>bat</code> / <code>eza</code> + 互動式的 <code>fzf</code>），在每天重複幾十次的搜尋與瀏覽上更快更省力。第二個是<strong>終端機圖形化介面（TUI）</strong>：用 ASCII 與 Unicode 製圖字元做出的監控、圖表、多視窗、資料庫操作介面，只傳純文字、不依賴影像協定，在 SSH、手機平板、低頻寬連線下最穩。</p>
<h2 id="日常指令的現代替代品">日常指令的現代替代品</h2>
<ul>
<li><strong><a href="modern-cli-replacements/">現代 CLI 替代工具</a></strong> — <code>grep</code> → <code>ripgrep</code>、<code>find</code> → <code>fd</code>、<code>cat</code> → <code>bat</code>、<code>ls</code> → <code>eza</code>，加上互動式模糊搜尋 <code>fzf</code>。什麼情境值得換、換了要注意什麼、為什麼別在腳本裡依賴它們。</li>
</ul>
<h2 id="終端機圖形化介面tui">終端機圖形化介面（TUI）</h2>
<p>這一類「圖形化」是用製圖字元畫出來的介面，而不是把 PNG／JPG 渲染進終端機，所以傳輸量小、在低頻寬與手機連線下最穩。大致分六類：</p>
<ul>
<li><strong>TUI 監控與儀表板</strong> — <code>btop</code> / <code>htop</code> / <code>k9s</code> / <code>ncdu</code> 等系統監控的全螢幕互動介面；版控專用的 git 線圖工具（<code>tig</code> / <code>lazygit</code> / <code>gitui</code>）是同類 TUI 但獨立的子題。</li>
<li><strong>ASCII 與文字圖表</strong> — <code>gnuplot</code> / <code>termgraph</code> / <code>plotext</code> 等把資料畫成終端機圖表的工具。</li>
<li><strong>終端機多工器</strong> — <code>tmux</code> / <code>zellij</code>，分割畫面、連線斷了 session 還在。</li>
<li><strong>檔案管理器</strong> — <code>broot</code>（樹狀）/ <code>yazi</code> / <code>ranger</code>（Miller 欄狀），像 IDE 側邊欄那樣瀏覽目錄與預覽檔案。</li>
<li><strong>SQL 客戶端</strong> — <code>harlequin</code>（IDE 風）/ <code>lazysql</code>（瀏覽器風）/ <code>pgcli</code>、<code>litecli</code>（增強 REPL），在終端機連資料庫跑查詢。</li>
<li><strong>訊息佇列客戶端</strong> — Kafka 的 <code>kaskade</code> / <code>yozefu</code> / <code>ktea</code>（全螢幕 TUI）、Redis 的 <code>iredis</code>（增強 REPL），在終端機連 broker 瀏覽 topic 與訊息。</li>
</ul>
<p>這個系列的每篇文章都用實機驗證導向的流程生產（裝起來實跑、TUI 交人互動驗、驗不了的標 caveat）。要擴展新類別時，照 <a href="/blog/posts/%E9%A9%97%E8%AD%89%E5%B0%8E%E5%90%91%E7%9A%84-cli-%E5%B7%A5%E5%85%B7%E6%96%87%E7%AB%A0%E5%AE%98%E6%96%B9-docs-%E6%9F%A5%E6%A0%B8%E6%94%BE%E9%81%8E%E7%9A%84%E8%90%BD%E5%B7%AE%E9%A1%9E%E5%9E%8B/" data-link-title="驗證導向的 CLI 工具文章：官方 docs 查核放過的落差類型" data-link-desc="CLI 工具教學的指令正確性不能只靠官方文件查核、要實機驗證時回來。官方文件驗的是「文件說的是否正確」、驗不了「文件沒說的是否存在」。">驗證導向的 CLI 工具文章生產流程</a> 走。</p>
<hr>
<h2 id="跟工具選單其他子系列的邊界">跟工具選單其他子系列的邊界</h2>
<p>CLI 環境工具跟 tools 底下另外兩個子系列的分界：</p>
<table>
  <thead>
      <tr>
          <th>情境</th>
          <th>該看</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>純終端機下的指令替代與 TUI</td>
          <td>本系列</td>
      </tr>
      <tr>
          <td>有圖形環境、要挑桌面 app（檔案管理員、DE）</td>
          <td><a href="../gui/">圖形桌面工具</a></td>
      </tr>
      <tr>
          <td>遠端操作、把 session 留在遠端不掉</td>
          <td><a href="../remote/">遠端工具</a>（多工器的遠端應用面）</td>
      </tr>
  </tbody>
</table>
<p>多工器（<code>tmux</code> / <code>zellij</code>）與檔案瀏覽（<code>broot</code> / <code>yazi</code>）這類工具兩邊都會提到：本系列講它們在純終端機下的用法與選型，遠端 / 圖形的情境應用則由 remote / gui 兩系列承接。這些工具的配置檔怎麼版控、跨機器同步，見 <a href="/blog/linux/dotfile/" data-link-title="Dotfile 工作環境配置指南" data-link-desc="個人開發環境的配置管理 — dotfile 結構設計、同步策略、shell 與終端機配置、平鋪式視窗管理、桌面客製化，從個人工具鏈延伸到團隊環境標準化">Dotfile 管理</a> 的<a href="/blog/linux/dotfile/03-terminal-ecosystem/" data-link-title="模組三：終端機與編輯器" data-link-desc="終端機相關工具的配置檔散落在不同位置、不確定哪些該進 dotfile repo 時回來讀">終端機與編輯器</a>模組。</p>
<hr>
<p>底下自動列出本系列的所有文章、依日期排序。</p>
]]></content:encoded></item><item><title>終端機訊息佇列客戶端：Kafka 的 kaskade/yozefu/ktea 與 Redis 的 iredis</title><link>https://tarrragon.github.io/blog/linux/tools/cli/message-queue-tui-clients/</link><pubDate>Tue, 16 Jun 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/linux/tools/cli/message-queue-tui-clients/</guid><description>&lt;p>終端機訊息佇列客戶端把 broker 的 topic、partition、consumer group 與訊息內容做成可導航的文字介面，讓遠端只有終端機時也能瀏覽訊息流、消費單一 topic、看消費進度，取代把連線資訊餵給桌面工具（Kafka 的 Conduktor、Redis 的 RedisInsight）的需求。它跟 broker 自帶的純指令工具（&lt;code>kafka-topics.sh&lt;/code>、&lt;code>rabbitmqctl&lt;/code>、&lt;code>redis-cli&lt;/code>）互補：指令工具適合腳本與一次性查詢，TUI 適合「邊看 topic 清單邊翻訊息內容」這種互動探索。&lt;/p>
&lt;p>本文承接 &lt;a href="https://tarrragon.github.io/blog/linux/tools/cli/cli-graphical-tools-overview/" data-link-title="終端機圖形化工具總覽：遠端操作下的 TUI、文字圖表與多工器" data-link-desc="在純文字終端機裡用 ASCII 與製圖字元做出監控儀表板、資料圖表與多視窗操作的工具總覽，並針對 SSH 伺服器、手機平板、低頻寬三種遠端情境給出選型判讀。">終端機圖形化工具總覽&lt;/a> 的訊息佇列客戶端分類。broker 端的純指令操作與 vendor 選型見 &lt;a href="https://tarrragon.github.io/blog/backend/03-message-queue/vendors/kafka/" data-link-title="Apache Kafka" data-link-desc="Distributed event streaming platform、log-based 模型">Kafka&lt;/a>、&lt;a href="https://tarrragon.github.io/blog/backend/03-message-queue/vendors/redis-streams/" data-link-title="Redis Streams" data-link-desc="Redis 生態內的 streams、append-only log &amp;#43; consumer group">Redis Streams&lt;/a>、&lt;a href="https://tarrragon.github.io/blog/backend/03-message-queue/vendors/rabbitmq/" data-link-title="RabbitMQ" data-link-desc="Classic message broker、AMQP routing 為主">RabbitMQ&lt;/a> 服務頁。&lt;/p>
&lt;h2 id="跟-sql-客戶端最大的不同多半綁單一-broker-協議">跟 SQL 客戶端最大的不同：多半綁單一 broker 協議&lt;/h2>
&lt;p>訊息佇列 TUI 幾乎都綁定單一 broker 協議，這是選型要先認清的一點，也跟 SQL 客戶端剛好相反。&lt;a href="https://tarrragon.github.io/blog/linux/tools/cli/sql-database-clients/" data-link-title="終端機 SQL 客戶端：harlequin、lazysql 與 pgcli/litecli 的選型" data-link-desc="在純文字終端機連資料庫、跑查詢、看結果的客戶端：全螢幕 TUI（harlequin IDE 風、lazysql 瀏覽器風）與增強型 REPL（pgcli/litecli）兩種範式，以及遠端連線的 SSL driver gotcha。">SQL 客戶端&lt;/a> 一個工具靠 adapter 連 Postgres、MySQL、SQLite 多種資料庫；訊息佇列這邊，Kafka 的 TUI 說的是 Kafka protocol、不認 AMQP，RabbitMQ 的 TUI 走 management API、也不讀 Kafka topic。能同時連多種 broker 的工具是少數例外（見後文 queuepeek）。&lt;/p>
&lt;p>所以選型順序是先定 broker、再挑該 broker 生態的工具。實機盤點下來，Kafka 的 TUI 生態最成熟（多個活躍專案、安裝管道齊全），Redis 有強的增強型 REPL，RabbitMQ 與跨 broker 工具仍在早期。&lt;/p>
&lt;h2 id="兩種範式全螢幕-tui-與增強型-repl">兩種範式：全螢幕 TUI 與增強型 REPL&lt;/h2>
&lt;p>訊息佇列客戶端沿用跟 SQL 客戶端同一組範式區分。全螢幕 TUI（&lt;code>kaskade&lt;/code> / &lt;code>yozefu&lt;/code> / &lt;code>ktea&lt;/code>）把 topic 清單、訊息內容、consumer 狀態排進多個面板，鍵盤導航瀏覽；增強型 REPL（&lt;code>iredis&lt;/code>）仍是一行行打指令，但加上補全、語法高亮與型別感知輸出，是原生 client 的升級版。&lt;/p>
&lt;p>選哪種看工作型態：要在多個 topic 間翻訊息、看 partition 與 consumer group 全貌，用全螢幕 TUI；要快速接上跑幾條指令、或塞進腳本，用增強型 REPL。&lt;/p>
&lt;h2 id="kafka-全螢幕-tuikaskadeyozefuktea">Kafka 全螢幕 TUI：kaskade、yozefu、ktea&lt;/h2>
&lt;p>Kafka 有三個定位不同的全螢幕 TUI，互動模型與連線設定各異。&lt;/p>
&lt;p>&lt;code>kaskade&lt;/code>（Python、Textual 寫，實測 4.0.7）分 admin 與 consumer 兩個子命令，連線參數走 &lt;code>-b&lt;/code>。&lt;code>kaskade admin -b localhost:9092&lt;/code> 進管理模式，實測連上 broker 後渲染出 topics 面板，欄位是 name、partitions、replicas、in sync、groups、members、records，一頁看完叢集的 topic 全貌。&lt;code>kaskade consumer -b localhost:9092 -t orders --from-beginning&lt;/code> 進消費模式翻單一 topic 的訊息，&lt;code>-v json&lt;/code> 與 &lt;code>-v registry&lt;/code> 切 payload 解碼方式，後者配 &lt;code>--registry url=http://localhost:8081&lt;/code> 接 Schema Registry。SSL / SASL 不走 &lt;code>-b&lt;/code>，要用 &lt;code>--config security.protocol=SSL&lt;/code> 逐項帶或 &lt;code>--config-file kafka.properties&lt;/code> 餵設定檔。&lt;/p>
&lt;p>&lt;code>yozefu&lt;/code>（Rust 寫、binary 名是 &lt;code>yozf&lt;/code>，MAIF 維護）主打跨 topic 的搜尋查詢，把找特定 record 當成核心場景。它的查詢語言是 SQL 風的，預設 &lt;code>initial_query&lt;/code> 是 &lt;code>from end - 10&lt;/code>（從尾端往回取 10 筆），search filter 還能用 WebAssembly 自訂（&lt;code>create-filter&lt;/code> / &lt;code>import-filter&lt;/code> 子命令）。連線走 config 模型而非純 flag：&lt;code>yozf config&lt;/code> 會印出設定（檔案在 &lt;code>~/Library/Application Support/io.maif.yozefu/config.json&lt;/code>），每個 cluster 在裡面定義 &lt;code>bootstrap.servers&lt;/code>、&lt;code>security.protocol&lt;/code> 與 schema registry，再用 &lt;code>yozf -c &amp;lt;cluster&amp;gt; -t &amp;lt;topics&amp;gt;&lt;/code> 指定要連哪個。&lt;/p></description><content:encoded><![CDATA[<p>終端機訊息佇列客戶端把 broker 的 topic、partition、consumer group 與訊息內容做成可導航的文字介面，讓遠端只有終端機時也能瀏覽訊息流、消費單一 topic、看消費進度，取代把連線資訊餵給桌面工具（Kafka 的 Conduktor、Redis 的 RedisInsight）的需求。它跟 broker 自帶的純指令工具（<code>kafka-topics.sh</code>、<code>rabbitmqctl</code>、<code>redis-cli</code>）互補：指令工具適合腳本與一次性查詢，TUI 適合「邊看 topic 清單邊翻訊息內容」這種互動探索。</p>
<p>本文承接 <a href="/blog/linux/tools/cli/cli-graphical-tools-overview/" data-link-title="終端機圖形化工具總覽：遠端操作下的 TUI、文字圖表與多工器" data-link-desc="在純文字終端機裡用 ASCII 與製圖字元做出監控儀表板、資料圖表與多視窗操作的工具總覽，並針對 SSH 伺服器、手機平板、低頻寬三種遠端情境給出選型判讀。">終端機圖形化工具總覽</a> 的訊息佇列客戶端分類。broker 端的純指令操作與 vendor 選型見 <a href="/blog/backend/03-message-queue/vendors/kafka/" data-link-title="Apache Kafka" data-link-desc="Distributed event streaming platform、log-based 模型">Kafka</a>、<a href="/blog/backend/03-message-queue/vendors/redis-streams/" data-link-title="Redis Streams" data-link-desc="Redis 生態內的 streams、append-only log &#43; consumer group">Redis Streams</a>、<a href="/blog/backend/03-message-queue/vendors/rabbitmq/" data-link-title="RabbitMQ" data-link-desc="Classic message broker、AMQP routing 為主">RabbitMQ</a> 服務頁。</p>
<h2 id="跟-sql-客戶端最大的不同多半綁單一-broker-協議">跟 SQL 客戶端最大的不同：多半綁單一 broker 協議</h2>
<p>訊息佇列 TUI 幾乎都綁定單一 broker 協議，這是選型要先認清的一點，也跟 SQL 客戶端剛好相反。<a href="/blog/linux/tools/cli/sql-database-clients/" data-link-title="終端機 SQL 客戶端：harlequin、lazysql 與 pgcli/litecli 的選型" data-link-desc="在純文字終端機連資料庫、跑查詢、看結果的客戶端：全螢幕 TUI（harlequin IDE 風、lazysql 瀏覽器風）與增強型 REPL（pgcli/litecli）兩種範式，以及遠端連線的 SSL driver gotcha。">SQL 客戶端</a> 一個工具靠 adapter 連 Postgres、MySQL、SQLite 多種資料庫；訊息佇列這邊，Kafka 的 TUI 說的是 Kafka protocol、不認 AMQP，RabbitMQ 的 TUI 走 management API、也不讀 Kafka topic。能同時連多種 broker 的工具是少數例外（見後文 queuepeek）。</p>
<p>所以選型順序是先定 broker、再挑該 broker 生態的工具。實機盤點下來，Kafka 的 TUI 生態最成熟（多個活躍專案、安裝管道齊全），Redis 有強的增強型 REPL，RabbitMQ 與跨 broker 工具仍在早期。</p>
<h2 id="兩種範式全螢幕-tui-與增強型-repl">兩種範式：全螢幕 TUI 與增強型 REPL</h2>
<p>訊息佇列客戶端沿用跟 SQL 客戶端同一組範式區分。全螢幕 TUI（<code>kaskade</code> / <code>yozefu</code> / <code>ktea</code>）把 topic 清單、訊息內容、consumer 狀態排進多個面板，鍵盤導航瀏覽；增強型 REPL（<code>iredis</code>）仍是一行行打指令，但加上補全、語法高亮與型別感知輸出，是原生 client 的升級版。</p>
<p>選哪種看工作型態：要在多個 topic 間翻訊息、看 partition 與 consumer group 全貌，用全螢幕 TUI；要快速接上跑幾條指令、或塞進腳本，用增強型 REPL。</p>
<h2 id="kafka-全螢幕-tuikaskadeyozefuktea">Kafka 全螢幕 TUI：kaskade、yozefu、ktea</h2>
<p>Kafka 有三個定位不同的全螢幕 TUI，互動模型與連線設定各異。</p>
<p><code>kaskade</code>（Python、Textual 寫，實測 4.0.7）分 admin 與 consumer 兩個子命令，連線參數走 <code>-b</code>。<code>kaskade admin -b localhost:9092</code> 進管理模式，實測連上 broker 後渲染出 topics 面板，欄位是 name、partitions、replicas、in sync、groups、members、records，一頁看完叢集的 topic 全貌。<code>kaskade consumer -b localhost:9092 -t orders --from-beginning</code> 進消費模式翻單一 topic 的訊息，<code>-v json</code> 與 <code>-v registry</code> 切 payload 解碼方式，後者配 <code>--registry url=http://localhost:8081</code> 接 Schema Registry。SSL / SASL 不走 <code>-b</code>，要用 <code>--config security.protocol=SSL</code> 逐項帶或 <code>--config-file kafka.properties</code> 餵設定檔。</p>
<p><code>yozefu</code>（Rust 寫、binary 名是 <code>yozf</code>，MAIF 維護）主打跨 topic 的搜尋查詢，把找特定 record 當成核心場景。它的查詢語言是 SQL 風的，預設 <code>initial_query</code> 是 <code>from end - 10</code>（從尾端往回取 10 筆），search filter 還能用 WebAssembly 自訂（<code>create-filter</code> / <code>import-filter</code> 子命令）。連線走 config 模型而非純 flag：<code>yozf config</code> 會印出設定（檔案在 <code>~/Library/Application Support/io.maif.yozefu/config.json</code>），每個 cluster 在裡面定義 <code>bootstrap.servers</code>、<code>security.protocol</code> 與 schema registry，再用 <code>yozf -c &lt;cluster&gt; -t &lt;topics&gt;</code> 指定要連哪個。</p>
<p><code>ktea</code>（Go 寫，Homebrew 0.8.0）同樣是 config-based，cluster 連線設定走首次啟動的互動流程而非命令列旗標。啟動旗標有 <code>-debug</code> 與 <code>-plain-fonts</code>，後者在終端機沒裝 NerdFonts、圖示顯示成亂碼時關掉圖示。本機裝起來、啟動旗標確認過，cluster 連線與深層瀏覽走互動設定流程、未逐步驗證。</p>
<p>判讀：要一頁看完 topic / consumer group 狀態、或邊看邊消費，選 <code>kaskade</code>；要在大量 topic 裡用查詢撈特定 record，選 <code>yozefu</code> 的搜尋模型；<code>ktea</code> 是另一個 Go 單 binary 選擇、偏好互動式設定 cluster 的可評估。</p>
<h2 id="增強型-repliredisredis-與-redis-streams">增強型 REPL：iredis（Redis 與 Redis Streams）</h2>
<p><code>iredis</code>（Python 寫，實測 1.16.1）是 <code>redis-cli</code> 的增強版，補上指令補全、語法高亮與型別感知輸出，手感仍是 REPL。它跟 dbcli 家族的 <code>pgcli</code> / <code>litecli</code> 同一類定位。實測非互動可跑，把指令用管線餵進去就回結果：<code>echo &quot;DBSIZE&quot; | iredis -h localhost -p 6390</code>，適合塞腳本。</p>
<p>它對 Redis Streams（<a href="/blog/backend/03-message-queue/vendors/redis-streams/" data-link-title="Redis Streams" data-link-desc="Redis 生態內的 streams、append-only log &#43; consumer group">03 的 vendor 之一</a>）的檢視特別省事。<code>peek &lt;key&gt;</code> 會先看型別再自動取值，string 顯示 strlen 與內容、stream 走 <code>XINFO</code>；實測對一個 stream 跑 <code>XINFO STREAM</code> 直接回 length、last-generated-id 等欄位，不必先 <code>TYPE</code> 再決定下哪個讀取指令。它是通用 Redis client、不是 stream 專用工具，但 Redis Streams 的 consumer group 操作（<code>XPENDING</code>、<code>XCLAIM</code>、<code>XINFO GROUPS</code>）都在這套指令補全範圍內。</p>
<h2 id="rabbitmq-與跨-broker生態仍在早期">RabbitMQ 與跨 broker：生態仍在早期</h2>
<p>RabbitMQ 與「一個工具連多種 broker」這兩塊目前缺乏可直接安裝驗證的成熟工具，列出供參考、本機未實機驗證。</p>
<blockquote>
<p>RabbitMQ 的 TUI 候選有 <code>rabbitui</code>（走 RabbitMQ management API）與 <code>rabbithole</code>（帶 exchange / binding 的 topology browser、支援 Protobuf 解碼）。兩者都不在 Homebrew 與 crates.io 的發佈管道，本機未安裝驗證。在缺 TUI 的情況下，RabbitMQ 的互動瀏覽仍以內建的 Management UI（web，預設 15672 埠）為主，純終端機則回到 <code>rabbitmqctl</code> 與 <code>rabbitmqadmin</code>。</p></blockquote>
<blockquote>
<p>跨 broker 的 <code>queuepeek</code>（Rust 寫，宣稱同時連 RabbitMQ、Kafka、MQTT）對應 SQL 類裡 <code>usql</code> 的「一個工具連多種後端」定位。本機 <code>cargo install queuepeek</code> 在編譯 <code>rdkafka-sys</code>（綁定原生 librdkafka）階段失敗、未能驗證。</p></blockquote>
<h2 id="gotcha實測">gotcha（實測）</h2>
<ul>
<li><code>yozefu</code> 預設帶一個名為 <code>localhost</code> 的 cluster、指向 <code>localhost:9092</code>。連非預設 port（例如本機測試的 9093）要先 <code>yozf configure</code> 改掉 <code>bootstrap.servers</code>，直接用 flag 覆寫不會生效。</li>
<li><code>kaskade</code> 的 <code>-b</code> 只接 bootstrap server；SSL / SASL 等安全設定一律走 <code>--config key=value</code> 或 <code>--config-file</code>，混在 <code>-b</code> 裡會被當成 broker 位址。</li>
<li><code>ktea</code> 的 <code>-plain-fonts</code>：終端機沒裝 NerdFonts 時圖示會顯示成亂碼方塊，加這個旗標關掉圖示就恢復可讀。</li>
</ul>
<h2 id="同類其他選擇">同類其他選擇</h2>
<p>Redis 的全螢幕 TUI（如 <code>redis-tui</code>）與其他 Kafka TUI（如 <code>kafka-tui</code>）未在本輪實機驗證、列出供參考。Kafka TUI 這塊專案數量較多，挑選時以發佈管道（Homebrew / pip / crates.io 直接可裝）與維護活躍度篩選，不追求窮舉。</p>
<h2 id="下一步路由">下一步路由</h2>
<ul>
<li>broker 端純指令工具與 vendor 選型：<a href="/blog/backend/03-message-queue/vendors/kafka/" data-link-title="Apache Kafka" data-link-desc="Distributed event streaming platform、log-based 模型">Kafka</a>、<a href="/blog/backend/03-message-queue/vendors/redis-streams/" data-link-title="Redis Streams" data-link-desc="Redis 生態內的 streams、append-only log &#43; consumer group">Redis Streams</a>、<a href="/blog/backend/03-message-queue/vendors/rabbitmq/" data-link-title="RabbitMQ" data-link-desc="Classic message broker、AMQP routing 為主">RabbitMQ</a> 服務頁。</li>
<li>同範式的資料庫客戶端對照：<a href="/blog/linux/tools/cli/sql-database-clients/" data-link-title="終端機 SQL 客戶端：harlequin、lazysql 與 pgcli/litecli 的選型" data-link-desc="在純文字終端機連資料庫、跑查詢、看結果的客戶端：全螢幕 TUI（harlequin IDE 風、lazysql 瀏覽器風）與增強型 REPL（pgcli/litecli）兩種範式，以及遠端連線的 SSL driver gotcha。">終端機 SQL 客戶端</a>。</li>
<li>把客戶端擺進可持久化的多工器 pane：<a href="/blog/linux/tools/cli/tmux-persistence-and-basics/" data-link-title="tmux 基礎：遠端 session 持久化與基本操作" data-link-desc="tmux 終端機多工器的遠端使用核心：detach/reattach 讓 session 脫離連線生命週期、prefix key 與 window/pane 操作、手機友善的快捷鍵調校，以及 tmux 與 zellij 的選型對照。">tmux 基礎</a>。</li>
<li>訊息佇列客戶端在遠端工具分類中的定位：<a href="/blog/linux/tools/cli/cli-graphical-tools-overview/" data-link-title="終端機圖形化工具總覽：遠端操作下的 TUI、文字圖表與多工器" data-link-desc="在純文字終端機裡用 ASCII 與製圖字元做出監控儀表板、資料圖表與多視窗操作的工具總覽，並針對 SSH 伺服器、手機平板、低頻寬三種遠端情境給出選型判讀。">終端機圖形化工具總覽</a>。</li>
</ul>
]]></content:encoded></item><item><title>TUI 監控工具：btop、htop、k9s 的遠端使用與刷新率調校</title><link>https://tarrragon.github.io/blog/linux/tools/cli/tui-monitoring-tools/</link><pubDate>Mon, 15 Jun 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/linux/tools/cli/tui-monitoring-tools/</guid><description>&lt;p>TUI 監控工具負責把系統或叢集的即時狀態畫成全螢幕互動介面：即時呈現負載變化，並用鍵盤直接排序、過濾、送訊號，取代反覆敲 &lt;code>ps&lt;/code>、&lt;code>df&lt;/code>、&lt;code>free&lt;/code> 再自行拼湊。在遠端 SSH 情境下，它的關鍵變數是刷新率與頻寬的取捨，因為全螢幕介面每次刷新都會重送整片畫面。&lt;/p>
&lt;p>本文承接 &lt;a href="https://tarrragon.github.io/blog/linux/tools/cli/cli-graphical-tools-overview/" data-link-title="終端機圖形化工具總覽：遠端操作下的 TUI、文字圖表與多工器" data-link-desc="在純文字終端機裡用 ASCII 與製圖字元做出監控儀表板、資料圖表與多視窗操作的工具總覽，並針對 SSH 伺服器、手機平板、低頻寬三種遠端情境給出選型判讀。">終端機圖形化工具總覽&lt;/a> 的 TUI 工具脈絡，聚焦系統監控這一支在遠端的實際使用與調校。git 線圖工具（&lt;code>tig&lt;/code> / &lt;code>lazygit&lt;/code> / &lt;code>gitui&lt;/code>）雖然也是 TUI，但屬版控子題，獨立成 &lt;a href="https://tarrragon.github.io/blog/linux/tools/cli/git-line-graph-tools-for-remote-cli/" data-link-title="遠端 CLI 開發的 git 線圖工具選型：tig、lazygit、gitui 與管線增強" data-link-desc="純 CLI、遠端開發情境下查看 git 分支線圖的工具地景，從 tig 唯讀瀏覽到 lazygit/gitui 操作中樞的定位差異，含選型判準與 lazygit 上手、delta side-by-side diff 設定。">遠端 CLI 開發的 git 線圖工具選型&lt;/a>。&lt;/p>
&lt;h2 id="htop進程層的標準">htop：進程層的標準&lt;/h2>
&lt;p>htop 把進程清單畫成帶 CPU 與記憶體長條的全螢幕視圖，責任是即時看進程並直接操作。它用底部的功能鍵列引導操作，不必背指令。&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>按鍵&lt;/th>
 &lt;th>作用&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;code>F3&lt;/code>&lt;/td>
 &lt;td>搜尋進程&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>F4&lt;/code>&lt;/td>
 &lt;td>過濾（只顯示符合的進程）&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>F5&lt;/code>&lt;/td>
 &lt;td>樹狀檢視（看父子關係）&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>F6&lt;/code>&lt;/td>
 &lt;td>選排序欄位&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>F9&lt;/code>&lt;/td>
 &lt;td>送訊號（殺進程）&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>F10&lt;/code>&lt;/td>
 &lt;td>離開&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>遠端使用的關鍵是刷新延遲。htop 用 &lt;code>-d&lt;/code> 設定刷新間隔，單位是十分之一秒，所以 &lt;code>htop -d 30&lt;/code> 是每 3 秒刷新一次。慢速連線下把延遲調大換取畫面不卡、按鍵不延遲，可從 5 秒（&lt;code>htop -d 50&lt;/code>）起步，順了再往下調。這個 5 秒是經驗起點、不是測得的閾值，實際依連線 RTT 與終端尺寸調整（後面 btop 與判讀段沿用此基準）。&lt;/p>
&lt;h2 id="btop多資源儀表板">btop：多資源儀表板&lt;/h2>
&lt;p>btop 把 CPU、記憶體、網路、磁碟畫在同一畫面，並帶歷史曲線與滑鼠操作，責任是一眼總覽多個資源維度的趨勢。相較 htop 偏進程清單，btop 偏向整機儀表板。&lt;/p>
&lt;p>刷新率是 btop 在遠端最該調的設定。它的刷新間隔由 &lt;code>update_ms&lt;/code> 控制（預設 2000 毫秒），把間隔調短會讓全螢幕重畫更頻繁、在慢速連線吃掉頻寬。調整方式是按 &lt;code>Esc&lt;/code> 開 Options 選單改 &lt;code>update_ms&lt;/code>，或直接編輯設定檔 &lt;code>~/.config/btop/btop.conf&lt;/code> 的 &lt;code>update_ms&lt;/code> 值。判讀分界與 htop 相同：連線品質好可用較密的刷新換即時性，品質差就把間隔拉長，慢速連線可從 &lt;code>update_ms 5000&lt;/code>（5 秒）起步。&lt;/p>
&lt;h2 id="k9skubernetes-叢集導航">k9s：Kubernetes 叢集導航&lt;/h2>
&lt;p>k9s 把 &lt;code>kubectl&lt;/code> 的查詢與操作做成全螢幕導航介面，責任是讓叢集管理不必逐條敲 &lt;code>kubectl&lt;/code> 指令。它用冒號指令切換資源視圖，游標選中資源後用快捷鍵操作。&lt;/p>
&lt;blockquote>
&lt;p>安裝與 &lt;code>--refresh&lt;/code> 旗標已實機驗證；以下 &lt;code>:pods&lt;/code> 等叢集操作需連到 k8s cluster，依官方用法、本機未實機驗證。&lt;/p>&lt;/blockquote>
&lt;p>常見操作是輸入 &lt;code>:pods&lt;/code> 看 pod 清單、&lt;code>:svc&lt;/code> 看 service，游標停在某個 pod 上按 &lt;code>l&lt;/code> 看 log、&lt;code>d&lt;/code> 看 describe、&lt;code>s&lt;/code> 進 container shell。對遠端管理叢集的情境，它把「查狀態到進去除錯」的流程收進同一畫面，省去反覆切換指令的負擔。k9s 同樣是全螢幕 TUI、會定期輪詢叢集狀態，慢速連線下導航延遲明顯時，可在啟動時用 &lt;code>--refresh&lt;/code> 把輪詢間隔（秒）調長。&lt;/p>
&lt;h2 id="其他常用-tui-監控">其他常用 TUI 監控&lt;/h2>
&lt;p>不同資源維度有各自的專用 TUI，責任聚焦在單一面向。&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>工具&lt;/th>
 &lt;th>監控對象&lt;/th>
 &lt;th>用途&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;code>ncdu&lt;/code> / &lt;code>gdu&lt;/code>&lt;/td>
 &lt;td>磁碟空間&lt;/td>
 &lt;td>掃描目錄並用長條顯示各目錄佔多少空間&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>ctop&lt;/code>&lt;/td>
 &lt;td>容器&lt;/td>
 &lt;td>即時看各 container 的資源佔用&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>dive&lt;/code>&lt;/td>
 &lt;td>映像層&lt;/td>
 &lt;td>逐層分析 Docker image 的大小組成&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>這些工具的共同特性是各管一個維度：磁碟爆了用 &lt;code>ncdu&lt;/code> 找出是哪一包、容器資源異常用 &lt;code>ctop&lt;/code> 定位、要拆解 image 肥在哪用 &lt;code>dive&lt;/code>。遠端排查時依問題維度挑對應工具，比開一個大而全的儀表板更直接。&lt;/p>
&lt;p>Docker 相關的兩個工具值得多記一筆。&lt;code>dive&lt;/code> 除了 TUI，還有非互動的 &lt;code>--ci&lt;/code> 模式：&lt;code>dive &amp;lt;image&amp;gt; --ci&lt;/code> 會輸出 image 的 efficiency 與 wasted space，並依門檻判定 pass/fail，適合塞進 CI pipeline 擋住臃腫 image。&lt;code>ctop&lt;/code> 的單一容器細節視圖（游標選中按 &lt;code>Enter&lt;/code>）會把環境變數明文列出，含資料庫密碼這類敏感值，共享畫面或側錄時要留意。&lt;/p></description><content:encoded><![CDATA[<p>TUI 監控工具負責把系統或叢集的即時狀態畫成全螢幕互動介面：即時呈現負載變化，並用鍵盤直接排序、過濾、送訊號，取代反覆敲 <code>ps</code>、<code>df</code>、<code>free</code> 再自行拼湊。在遠端 SSH 情境下，它的關鍵變數是刷新率與頻寬的取捨，因為全螢幕介面每次刷新都會重送整片畫面。</p>
<p>本文承接 <a href="/blog/linux/tools/cli/cli-graphical-tools-overview/" data-link-title="終端機圖形化工具總覽：遠端操作下的 TUI、文字圖表與多工器" data-link-desc="在純文字終端機裡用 ASCII 與製圖字元做出監控儀表板、資料圖表與多視窗操作的工具總覽，並針對 SSH 伺服器、手機平板、低頻寬三種遠端情境給出選型判讀。">終端機圖形化工具總覽</a> 的 TUI 工具脈絡，聚焦系統監控這一支在遠端的實際使用與調校。git 線圖工具（<code>tig</code> / <code>lazygit</code> / <code>gitui</code>）雖然也是 TUI，但屬版控子題，獨立成 <a href="/blog/linux/tools/cli/git-line-graph-tools-for-remote-cli/" data-link-title="遠端 CLI 開發的 git 線圖工具選型：tig、lazygit、gitui 與管線增強" data-link-desc="純 CLI、遠端開發情境下查看 git 分支線圖的工具地景，從 tig 唯讀瀏覽到 lazygit/gitui 操作中樞的定位差異，含選型判準與 lazygit 上手、delta side-by-side diff 設定。">遠端 CLI 開發的 git 線圖工具選型</a>。</p>
<h2 id="htop進程層的標準">htop：進程層的標準</h2>
<p>htop 把進程清單畫成帶 CPU 與記憶體長條的全螢幕視圖，責任是即時看進程並直接操作。它用底部的功能鍵列引導操作，不必背指令。</p>
<table>
  <thead>
      <tr>
          <th>按鍵</th>
          <th>作用</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>F3</code></td>
          <td>搜尋進程</td>
      </tr>
      <tr>
          <td><code>F4</code></td>
          <td>過濾（只顯示符合的進程）</td>
      </tr>
      <tr>
          <td><code>F5</code></td>
          <td>樹狀檢視（看父子關係）</td>
      </tr>
      <tr>
          <td><code>F6</code></td>
          <td>選排序欄位</td>
      </tr>
      <tr>
          <td><code>F9</code></td>
          <td>送訊號（殺進程）</td>
      </tr>
      <tr>
          <td><code>F10</code></td>
          <td>離開</td>
      </tr>
  </tbody>
</table>
<p>遠端使用的關鍵是刷新延遲。htop 用 <code>-d</code> 設定刷新間隔，單位是十分之一秒，所以 <code>htop -d 30</code> 是每 3 秒刷新一次。慢速連線下把延遲調大換取畫面不卡、按鍵不延遲，可從 5 秒（<code>htop -d 50</code>）起步，順了再往下調。這個 5 秒是經驗起點、不是測得的閾值，實際依連線 RTT 與終端尺寸調整（後面 btop 與判讀段沿用此基準）。</p>
<h2 id="btop多資源儀表板">btop：多資源儀表板</h2>
<p>btop 把 CPU、記憶體、網路、磁碟畫在同一畫面，並帶歷史曲線與滑鼠操作，責任是一眼總覽多個資源維度的趨勢。相較 htop 偏進程清單，btop 偏向整機儀表板。</p>
<p>刷新率是 btop 在遠端最該調的設定。它的刷新間隔由 <code>update_ms</code> 控制（預設 2000 毫秒），把間隔調短會讓全螢幕重畫更頻繁、在慢速連線吃掉頻寬。調整方式是按 <code>Esc</code> 開 Options 選單改 <code>update_ms</code>，或直接編輯設定檔 <code>~/.config/btop/btop.conf</code> 的 <code>update_ms</code> 值。判讀分界與 htop 相同：連線品質好可用較密的刷新換即時性，品質差就把間隔拉長，慢速連線可從 <code>update_ms 5000</code>（5 秒）起步。</p>
<h2 id="k9skubernetes-叢集導航">k9s：Kubernetes 叢集導航</h2>
<p>k9s 把 <code>kubectl</code> 的查詢與操作做成全螢幕導航介面，責任是讓叢集管理不必逐條敲 <code>kubectl</code> 指令。它用冒號指令切換資源視圖，游標選中資源後用快捷鍵操作。</p>
<blockquote>
<p>安裝與 <code>--refresh</code> 旗標已實機驗證；以下 <code>:pods</code> 等叢集操作需連到 k8s cluster，依官方用法、本機未實機驗證。</p></blockquote>
<p>常見操作是輸入 <code>:pods</code> 看 pod 清單、<code>:svc</code> 看 service，游標停在某個 pod 上按 <code>l</code> 看 log、<code>d</code> 看 describe、<code>s</code> 進 container shell。對遠端管理叢集的情境，它把「查狀態到進去除錯」的流程收進同一畫面，省去反覆切換指令的負擔。k9s 同樣是全螢幕 TUI、會定期輪詢叢集狀態，慢速連線下導航延遲明顯時，可在啟動時用 <code>--refresh</code> 把輪詢間隔（秒）調長。</p>
<h2 id="其他常用-tui-監控">其他常用 TUI 監控</h2>
<p>不同資源維度有各自的專用 TUI，責任聚焦在單一面向。</p>
<table>
  <thead>
      <tr>
          <th>工具</th>
          <th>監控對象</th>
          <th>用途</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>ncdu</code> / <code>gdu</code></td>
          <td>磁碟空間</td>
          <td>掃描目錄並用長條顯示各目錄佔多少空間</td>
      </tr>
      <tr>
          <td><code>ctop</code></td>
          <td>容器</td>
          <td>即時看各 container 的資源佔用</td>
      </tr>
      <tr>
          <td><code>dive</code></td>
          <td>映像層</td>
          <td>逐層分析 Docker image 的大小組成</td>
      </tr>
  </tbody>
</table>
<p>這些工具的共同特性是各管一個維度：磁碟爆了用 <code>ncdu</code> 找出是哪一包、容器資源異常用 <code>ctop</code> 定位、要拆解 image 肥在哪用 <code>dive</code>。遠端排查時依問題維度挑對應工具，比開一個大而全的儀表板更直接。</p>
<p>Docker 相關的兩個工具值得多記一筆。<code>dive</code> 除了 TUI，還有非互動的 <code>--ci</code> 模式：<code>dive &lt;image&gt; --ci</code> 會輸出 image 的 efficiency 與 wasted space，並依門檻判定 pass/fail，適合塞進 CI pipeline 擋住臃腫 image。<code>ctop</code> 的單一容器細節視圖（游標選中按 <code>Enter</code>）會把環境變數明文列出，含資料庫密碼這類敏感值，共享畫面或側錄時要留意。</p>
<h2 id="遠端刷新率與頻寬的取捨">遠端刷新率與頻寬的取捨</h2>
<p>全螢幕 TUI 監控的遠端成本核心在於：每次刷新會重送整片字元矩陣，刷新越密、頻寬負擔越重。慢速連線下會看到畫面延遲、按鍵反應慢。對策是把刷新間隔調長（<code>htop -d</code>、btop 的 <code>update_ms</code>），用更新頻率換流暢度。</p>
<p>判讀分界落在刷新率與監控粒度：連線順暢時用 1–2 秒的密集刷新看即時變化；連線吃緊時把間隔拉到 5 秒以上，或當只盯單一指標時改用一次性的文字趨勢（見 <a href="/blog/linux/tools/cli/ascii-charts-in-terminal/" data-link-title="終端機文字圖表：gnuplot、termgraph、plotext 與 sparkline" data-link-desc="把數值畫成終端機文字圖的工具：gnuplot dumb terminal、termgraph 長條圖、plotext 腳本繪圖、sparkline 與 pipeline 即時更新，以及遠端情境下一次性輸出省頻寬的判讀。">終端機文字圖表</a>）而非全螢幕儀表板。</p>
<h2 id="下一步路由">下一步路由</h2>
<ul>
<li>把監控擺進可持久化的多工器：<a href="/blog/linux/tools/cli/tmux-persistence-and-basics/" data-link-title="tmux 基礎：遠端 session 持久化與基本操作" data-link-desc="tmux 終端機多工器的遠端使用核心：detach/reattach 讓 session 脫離連線生命週期、prefix key 與 window/pane 操作、手機友善的快捷鍵調校，以及 tmux 與 zellij 的選型對照。">tmux 基礎</a>，斷線後 reattach 回去監控還在跑。</li>
<li>一次性的文字趨勢圖（省頻寬的替代）：<a href="/blog/linux/tools/cli/ascii-charts-in-terminal/" data-link-title="終端機文字圖表：gnuplot、termgraph、plotext 與 sparkline" data-link-desc="把數值畫成終端機文字圖的工具：gnuplot dumb terminal、termgraph 長條圖、plotext 腳本繪圖、sparkline 與 pipeline 即時更新，以及遠端情境下一次性輸出省頻寬的判讀。">終端機文字圖表</a>。</li>
<li>監控的是 web 請求而非系統資源：<a href="/blog/linux/tools/cli/web-server-log-monitoring/" data-link-title="終端機看 nginx 請求：GoAccess、ngxtop 與何時該用 pipeline 而非 TUI" data-link-desc="在終端機即時看 nginx／web 伺服器請求的工具：GoAccess 即時儀表板、ngxtop top 風格，含 log 格式對齊的 gotcha；以及「當下排查用 TUI、持續監控用 metrics pipeline」的使用時機分界。">終端機看 nginx 請求</a>（GoAccess / ngxtop）。</li>
<li>TUI 監控在遠端工具分類中的定位：<a href="/blog/linux/tools/cli/cli-graphical-tools-overview/" data-link-title="終端機圖形化工具總覽：遠端操作下的 TUI、文字圖表與多工器" data-link-desc="在純文字終端機裡用 ASCII 與製圖字元做出監控儀表板、資料圖表與多視窗操作的工具總覽，並針對 SSH 伺服器、手機平板、低頻寬三種遠端情境給出選型判讀。">終端機圖形化工具總覽</a>。</li>
</ul>
]]></content:encoded></item><item><title>終端機 SQL 客戶端：harlequin、lazysql 與 pgcli/litecli 的選型</title><link>https://tarrragon.github.io/blog/linux/tools/cli/sql-database-clients/</link><pubDate>Mon, 15 Jun 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/linux/tools/cli/sql-database-clients/</guid><description>&lt;p>終端機 SQL 客戶端把資料庫的 schema、表格與查詢結果做成可導航的文字介面，讓遠端只有終端機時也能瀏覽資料、跑查詢、看結果，取代把連線資訊餵給桌面 GUI（DBeaver、TablePlus）的需求。在純 SSH 情境下，它補上「連到遠端 DB 做事」這塊，而且全是文字、低頻寬友善。&lt;/p>
&lt;p>本文承接 &lt;a href="https://tarrragon.github.io/blog/linux/tools/cli/cli-graphical-tools-overview/" data-link-title="終端機圖形化工具總覽：遠端操作下的 TUI、文字圖表與多工器" data-link-desc="在純文字終端機裡用 ASCII 與製圖字元做出監控儀表板、資料圖表與多視窗操作的工具總覽，並針對 SSH 伺服器、手機平板、低頻寬三種遠端情境給出選型判讀。">終端機圖形化工具總覽&lt;/a> 的資料庫客戶端分類。工具分兩種範式：全螢幕 TUI 客戶端，與增強型 REPL。&lt;/p>
&lt;h2 id="兩種範式全螢幕-tui-與增強型-repl">兩種範式：全螢幕 TUI 與增強型 REPL&lt;/h2>
&lt;p>全螢幕 TUI（&lt;code>harlequin&lt;/code> / &lt;code>lazysql&lt;/code>）把 schema 樹、查詢編輯器、結果表格排進多個面板，像縮小版的 DBeaver。增強型 REPL（&lt;code>pgcli&lt;/code> / &lt;code>litecli&lt;/code>）仍是一行一行打 SQL，但加上語法高亮、智能補全與表格化輸出，是 &lt;code>psql&lt;/code> / &lt;code>mysql&lt;/code> 原生 client 的升級版。&lt;/p>
&lt;p>選哪種看工作型態：要邊看 schema 邊探索資料，用全螢幕 TUI；要快速接上跑幾條查詢、或塞進腳本，用 REPL。&lt;/p>
&lt;h2 id="全螢幕-tuiide-風與瀏覽器風">全螢幕 TUI：IDE 風與瀏覽器風&lt;/h2>
&lt;p>兩個全螢幕 TUI 的互動模型剛好相反，這是選型最該先分清的一點。&lt;/p>
&lt;p>&lt;code>harlequin&lt;/code> 是 SQL IDE 風：左側 Data Catalog 樹列出 db → schema → table → 欄位（帶型別標記，整數 &lt;code>#&lt;/code>、字串 &lt;code>s&lt;/code>、numeric &lt;code>#.#&lt;/code>），中間是查詢編輯器，寫好 SQL 按 &lt;code>Ctrl+Enter&lt;/code> 執行、結果在下方表格。點表只是把表的限定名稱插進編輯器、輔助組查詢，不會自動顯示資料。它用 Python（Textual）寫，adapter 涵蓋 postgres、mysql、sqlite、duckdb、odbc，預設 adapter 是 duckdb，連別的 DB 用 &lt;code>-a&lt;/code> 指定，例如 &lt;code>harlequin -a postgres &amp;quot;&amp;lt;連線字串&amp;gt;&amp;quot;&lt;/code> 或 &lt;code>harlequin -a sqlite db.sqlite&lt;/code>。&lt;/p>
&lt;p>&lt;code>lazysql&lt;/code> 是瀏覽器風：左側選一個表，右邊直接顯示該表記錄、不必寫 SELECT。上方分頁切 Records / Columns / Constraints / Foreign Keys / Indexes（&lt;code>[&lt;/code> 與 &lt;code>]&lt;/code> 切換）。篩選按 &lt;code>/&lt;/code> 開 WHERE 輸入，帶運算子補全（&lt;code>=&lt;/code>、&lt;code>≠&lt;/code>、&lt;code>&amp;gt;&lt;/code>、&lt;code>between&lt;/code>、&lt;code>ilike&lt;/code>、&lt;code>in&lt;/code>、&lt;code>like&lt;/code>、&lt;code>regexp&lt;/code> 等），只寫條件、不用整句。要跑自訂 SQL 按 &lt;code>Ctrl+E&lt;/code> 開編輯器（vim modal、有 &lt;code>-- INSERT --&lt;/code> 模式）寫完整語句、&lt;code>Ctrl+R&lt;/code> 執行。它用 Go 寫、lazygit 風的鍵盤導航。&lt;/p>
&lt;p>判讀：習慣先寫 query 再看結果的選 &lt;code>harlequin&lt;/code>；習慣點開表瀏覽、偶爾才下複雜 SQL 的選 &lt;code>lazysql&lt;/code>。&lt;/p>
&lt;p>&lt;code>dblab&lt;/code>（Go）與 &lt;code>rainfrog&lt;/code>（Rust）是另外兩個實機驗證過的瀏覽風 TUI。&lt;code>dblab&lt;/code> 走混合型：左側樹（&lt;code>Ctrl+H&lt;/code> 聚焦、&lt;code>j&lt;/code>/&lt;code>k&lt;/code> 移動、&lt;code>Enter&lt;/code> 看表的列）配上方查詢編輯器（&lt;code>Ctrl+E&lt;/code> 執行），瀏覽與寫 query 兩條路都有。它有一個實測 gotcha：編輯器的查詢要 schema 限定（&lt;code>SELECT * FROM public.products&lt;/code> 才行、裸 &lt;code>products&lt;/code> 會報 relation 不存在），因為編輯器連線的 search_path 沒含 public，而樹瀏覽（&lt;code>Enter&lt;/code>）不受這點影響。&lt;code>rainfrog&lt;/code> 專注 Postgres：側欄選表看 rows / columns / constraints / indexes / rls policies，查詢編輯器是 vim modal（&lt;code>i&lt;/code> 進 insert、&lt;code>v&lt;/code> 進 visual），另有 history 與 favorites 分頁。實測它不支援滑鼠操作，面板與分頁一律用 &lt;code>Tab&lt;/code> 切換、其餘靠鍵盤導航。&lt;/p>
&lt;h2 id="增強型-repldbcli-家族">增強型 REPL：dbcli 家族&lt;/h2>
&lt;p>&lt;code>pgcli&lt;/code>（Postgres）、&lt;code>mycli&lt;/code>（MySQL）、&lt;code>litecli&lt;/code>（SQLite）是同一個專案（dbcli）的三個 client，把原生 &lt;code>psql&lt;/code> / &lt;code>mysql&lt;/code> / &lt;code>sqlite3&lt;/code> 補上智能補全（表名、欄位、關鍵字）、語法高亮與對齊的表格化輸出。手感仍是 REPL，但打 SQL 時會即時提示。&lt;/p>
&lt;p>它們也能非互動執行、適合腳本：&lt;code>litecli&lt;/code> 用 &lt;code>-e&lt;/code>（&lt;code>litecli db.sqlite -e &amp;quot;SELECT ...&amp;quot;&lt;/code>），&lt;code>pgcli&lt;/code> 在 stdin 非 TTY 時讀管線（&lt;code>echo &amp;quot;SELECT ...&amp;quot; | pgcli &amp;quot;&amp;lt;連線字串&amp;gt;&amp;quot;&lt;/code>），輸出是對齊的 ASCII 表格。要在腳本裡取一次查詢結果、又想要比 &lt;code>psql -c&lt;/code> 更好的排版時，這條路最直接。&lt;/p></description><content:encoded><![CDATA[<p>終端機 SQL 客戶端把資料庫的 schema、表格與查詢結果做成可導航的文字介面，讓遠端只有終端機時也能瀏覽資料、跑查詢、看結果，取代把連線資訊餵給桌面 GUI（DBeaver、TablePlus）的需求。在純 SSH 情境下，它補上「連到遠端 DB 做事」這塊，而且全是文字、低頻寬友善。</p>
<p>本文承接 <a href="/blog/linux/tools/cli/cli-graphical-tools-overview/" data-link-title="終端機圖形化工具總覽：遠端操作下的 TUI、文字圖表與多工器" data-link-desc="在純文字終端機裡用 ASCII 與製圖字元做出監控儀表板、資料圖表與多視窗操作的工具總覽，並針對 SSH 伺服器、手機平板、低頻寬三種遠端情境給出選型判讀。">終端機圖形化工具總覽</a> 的資料庫客戶端分類。工具分兩種範式：全螢幕 TUI 客戶端，與增強型 REPL。</p>
<h2 id="兩種範式全螢幕-tui-與增強型-repl">兩種範式：全螢幕 TUI 與增強型 REPL</h2>
<p>全螢幕 TUI（<code>harlequin</code> / <code>lazysql</code>）把 schema 樹、查詢編輯器、結果表格排進多個面板，像縮小版的 DBeaver。增強型 REPL（<code>pgcli</code> / <code>litecli</code>）仍是一行一行打 SQL，但加上語法高亮、智能補全與表格化輸出，是 <code>psql</code> / <code>mysql</code> 原生 client 的升級版。</p>
<p>選哪種看工作型態：要邊看 schema 邊探索資料，用全螢幕 TUI；要快速接上跑幾條查詢、或塞進腳本，用 REPL。</p>
<h2 id="全螢幕-tuiide-風與瀏覽器風">全螢幕 TUI：IDE 風與瀏覽器風</h2>
<p>兩個全螢幕 TUI 的互動模型剛好相反，這是選型最該先分清的一點。</p>
<p><code>harlequin</code> 是 SQL IDE 風：左側 Data Catalog 樹列出 db → schema → table → 欄位（帶型別標記，整數 <code>#</code>、字串 <code>s</code>、numeric <code>#.#</code>），中間是查詢編輯器，寫好 SQL 按 <code>Ctrl+Enter</code> 執行、結果在下方表格。點表只是把表的限定名稱插進編輯器、輔助組查詢，不會自動顯示資料。它用 Python（Textual）寫，adapter 涵蓋 postgres、mysql、sqlite、duckdb、odbc，預設 adapter 是 duckdb，連別的 DB 用 <code>-a</code> 指定，例如 <code>harlequin -a postgres &quot;&lt;連線字串&gt;&quot;</code> 或 <code>harlequin -a sqlite db.sqlite</code>。</p>
<p><code>lazysql</code> 是瀏覽器風：左側選一個表，右邊直接顯示該表記錄、不必寫 SELECT。上方分頁切 Records / Columns / Constraints / Foreign Keys / Indexes（<code>[</code> 與 <code>]</code> 切換）。篩選按 <code>/</code> 開 WHERE 輸入，帶運算子補全（<code>=</code>、<code>≠</code>、<code>&gt;</code>、<code>between</code>、<code>ilike</code>、<code>in</code>、<code>like</code>、<code>regexp</code> 等），只寫條件、不用整句。要跑自訂 SQL 按 <code>Ctrl+E</code> 開編輯器（vim modal、有 <code>-- INSERT --</code> 模式）寫完整語句、<code>Ctrl+R</code> 執行。它用 Go 寫、lazygit 風的鍵盤導航。</p>
<p>判讀：習慣先寫 query 再看結果的選 <code>harlequin</code>；習慣點開表瀏覽、偶爾才下複雜 SQL 的選 <code>lazysql</code>。</p>
<p><code>dblab</code>（Go）與 <code>rainfrog</code>（Rust）是另外兩個實機驗證過的瀏覽風 TUI。<code>dblab</code> 走混合型：左側樹（<code>Ctrl+H</code> 聚焦、<code>j</code>/<code>k</code> 移動、<code>Enter</code> 看表的列）配上方查詢編輯器（<code>Ctrl+E</code> 執行），瀏覽與寫 query 兩條路都有。它有一個實測 gotcha：編輯器的查詢要 schema 限定（<code>SELECT * FROM public.products</code> 才行、裸 <code>products</code> 會報 relation 不存在），因為編輯器連線的 search_path 沒含 public，而樹瀏覽（<code>Enter</code>）不受這點影響。<code>rainfrog</code> 專注 Postgres：側欄選表看 rows / columns / constraints / indexes / rls policies，查詢編輯器是 vim modal（<code>i</code> 進 insert、<code>v</code> 進 visual），另有 history 與 favorites 分頁。實測它不支援滑鼠操作，面板與分頁一律用 <code>Tab</code> 切換、其餘靠鍵盤導航。</p>
<h2 id="增強型-repldbcli-家族">增強型 REPL：dbcli 家族</h2>
<p><code>pgcli</code>（Postgres）、<code>mycli</code>（MySQL）、<code>litecli</code>（SQLite）是同一個專案（dbcli）的三個 client，把原生 <code>psql</code> / <code>mysql</code> / <code>sqlite3</code> 補上智能補全（表名、欄位、關鍵字）、語法高亮與對齊的表格化輸出。手感仍是 REPL，但打 SQL 時會即時提示。</p>
<p>它們也能非互動執行、適合腳本：<code>litecli</code> 用 <code>-e</code>（<code>litecli db.sqlite -e &quot;SELECT ...&quot;</code>），<code>pgcli</code> 在 stdin 非 TTY 時讀管線（<code>echo &quot;SELECT ...&quot; | pgcli &quot;&lt;連線字串&gt;&quot;</code>），輸出是對齊的 ASCII 表格。要在腳本裡取一次查詢結果、又想要比 <code>psql -c</code> 更好的排版時，這條路最直接。</p>
<p><code>usql</code> 走另一條路：universal CLI，一個工具用統一介面連 Postgres、MySQL、SQLite 等各種 DB，連線字串以 scheme 區分（<code>postgres://...</code>、<code>sqlite:...</code>），也支援 <code>-c</code> 非互動執行。它不是 TUI，行為像能連多種 DB 的加強版 <code>psql</code>。一台機器要連好幾種不同 DB 時，一個 usql 比每種 DB 各裝一個 client 省事。</p>
<h2 id="遠端連線的一個-gotchassl-模式因-driver-而異">遠端連線的一個 gotcha：SSL 模式因 driver 而異</h2>
<p>同一個 Postgres、同一條連線字串，不同 client 的 SSL 預設不一樣。<code>lazysql</code> 走 Go 的 <code>pq</code> driver、預設要求 SSL，連沒開 SSL 的 DB 會報 <code>pq: SSL is not enabled on the server</code>，要在連線字串加 <code>?sslmode=disable</code>：<code>postgresql://user:pass@host:5432/db?sslmode=disable</code>。<code>pgcli</code> 與 <code>harlequin</code> 走 Python 的 psycopg、預設行為不同，同樣的 DB 不加也能連。遠端連不上、又確定帳密與 port 對的時候，先查的就是 sslmode。</p>
<h2 id="同類其他選擇">同類其他選擇</h2>
<p>同範式還有 <code>gobang</code>（Rust）。它未上 crates.io、Homebrew 也沒有對應 formula，本機未能安裝，列出供參考、未實機驗證。</p>
<h2 id="下一步路由">下一步路由</h2>
<ul>
<li>把 DB client 擺進可持久化的多工器 pane：<a href="/blog/linux/tools/cli/tmux-persistence-and-basics/" data-link-title="tmux 基礎：遠端 session 持久化與基本操作" data-link-desc="tmux 終端機多工器的遠端使用核心：detach/reattach 讓 session 脫離連線生命週期、prefix key 與 window/pane 操作、手機友善的快捷鍵調校，以及 tmux 與 zellij 的選型對照。">tmux 基礎</a>。</li>
<li>編譯型工具（<code>lazysql</code> / <code>dblab</code> / <code>rainfrog</code>）搬到遠端的單一 binary 注意事項：<a href="/blog/linux/tools/cli/git-line-graph-tools-for-remote-cli/" data-link-title="遠端 CLI 開發的 git 線圖工具選型：tig、lazygit、gitui 與管線增強" data-link-desc="純 CLI、遠端開發情境下查看 git 分支線圖的工具地景，從 tig 唯讀瀏覽到 lazygit/gitui 操作中樞的定位差異，含選型判準與 lazygit 上手、delta side-by-side diff 設定。">git 線圖工具選型</a>。</li>
<li>SQL 客戶端在遠端工具分類中的定位：<a href="/blog/linux/tools/cli/cli-graphical-tools-overview/" data-link-title="終端機圖形化工具總覽：遠端操作下的 TUI、文字圖表與多工器" data-link-desc="在純文字終端機裡用 ASCII 與製圖字元做出監控儀表板、資料圖表與多視窗操作的工具總覽，並針對 SSH 伺服器、手機平板、低頻寬三種遠端情境給出選型判讀。">終端機圖形化工具總覽</a>。</li>
</ul>
]]></content:encoded></item><item><title>終端機看 nginx 請求：GoAccess、ngxtop 與何時該用 pipeline 而非 TUI</title><link>https://tarrragon.github.io/blog/linux/tools/cli/web-server-log-monitoring/</link><pubDate>Mon, 15 Jun 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/linux/tools/cli/web-server-log-monitoring/</guid><description>&lt;p>Web 伺服器日誌監控工具把 nginx／Apache 的 access log 解析成終端機可讀的請求統計，讓遠端 SSH 進去的那台機器上，能即時看到現在誰在打、打哪些路徑、回什麼狀態碼、吃多少頻寬。它跟系統監控（&lt;code>btop&lt;/code> 看 CPU／記憶體）的差別在於觀測對象：系統監控看主機資源，這類看的是 HTTP 請求流。&lt;/p>
&lt;p>本文承接 &lt;a href="https://tarrragon.github.io/blog/linux/tools/cli/cli-graphical-tools-overview/" data-link-title="終端機圖形化工具總覽：遠端操作下的 TUI、文字圖表與多工器" data-link-desc="在純文字終端機裡用 ASCII 與製圖字元做出監控儀表板、資料圖表與多視窗操作的工具總覽，並針對 SSH 伺服器、手機平板、低頻寬三種遠端情境給出選型判讀。">終端機圖形化工具總覽&lt;/a> 的 TUI 工具脈絡，屬監控的 web 請求子題。但比起工具本身，更該先分清的是「什麼時候用終端機看請求、什麼時候不該」，這放在最後一節。&lt;/p>
&lt;h2 id="goaccess即時請求儀表板">GoAccess：即時請求儀表板&lt;/h2>
&lt;p>&lt;code>GoAccess&lt;/code> 把 access log 解析成全螢幕的即時儀表板，責任是把一份 log 變成可讀的請求分析：狀態碼分布、top 請求路徑、不重複訪客、頻寬、回應時間、訪客的 OS 與瀏覽器。它既能開互動 TUI，也能輸出 HTML／CSV／JSON 報表。&lt;/p>
&lt;p>驗證它解析的正確性可以走非互動模式 — 餵一份 nginx access log、指定格式、輸出報表：&lt;/p>





&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="ln">1&lt;/span>&lt;span class="cl">goaccess access.log --log-format&lt;span class="o">=&lt;/span>COMBINED -o report.html&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;code>--log-format=COMBINED&lt;/code> 是對應 nginx 標準 combined 格式的預設。實測對一份 13 筆請求的 log，GoAccess 正確分出 9 筆 2xx、4 筆 4xx，並列出 top 路徑（&lt;code>/&lt;/code> 佔多數、&lt;code>/missing&lt;/code> 等 404）、訪客 host、user-agent 與頻寬。互動模式（不加 &lt;code>-o&lt;/code>）則是同一份資料的全螢幕即時版，連線中持續更新。&lt;/p>
&lt;h2 id="ngxtoptop-風格的請求即時表">ngxtop：top 風格的請求即時表&lt;/h2>
&lt;p>&lt;code>ngxtop&lt;/code> 把 access log 做成 &lt;code>top&lt;/code> 風格的即時表，責任是用最精簡的版面看「現在最熱的請求路徑與其狀態碼分布」。它比 GoAccess 輕、聚焦在請求路徑與狀態碼，適合快速掃一眼。&lt;/p>





&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="ln">1&lt;/span>&lt;span class="cl">ngxtop -l access.log --no-follow&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;code>--no-follow&lt;/code> 處理現有 log 後就退出（預設會持續跟隨新進的 log）。&lt;/p>
&lt;p>這裡有一個實測會撞到的 gotcha：&lt;strong>ngxtop 的 log 格式要跟實際的 nginx log_format 完全對上，否則它靜默回 0 records&lt;/strong>。nginx 官方 image 的預設 log_format 在標準 combined 之後多了一個 &lt;code>&amp;quot;$http_x_forwarded_for&amp;quot;&lt;/code> 欄位，ngxtop 的預設格式不含它，結果就是「跑得起來、但一筆都沒解析到」。對策是用 &lt;code>-f&lt;/code> 餵實際的格式：&lt;/p>





&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="ln">1&lt;/span>&lt;span class="cl">ngxtop -l access.log --no-follow &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">2&lt;/span>&lt;span class="cl">&lt;span class="se">&lt;/span> -f &lt;span class="s1">&amp;#39;$remote_addr - $remote_user [$time_local] &amp;#34;$request&amp;#34; $status $body_bytes_sent &amp;#34;$http_referer&amp;#34; &amp;#34;$http_user_agent&amp;#34; &amp;#34;$http_x_forwarded_for&amp;#34;&amp;#39;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>格式對上後，ngxtop 正確處理 13 筆、分出 9 筆 2xx 與 4 筆 4xx，跟 GoAccess 的結果一致。相較之下 GoAccess 的 &lt;code>--log-format=COMBINED&lt;/code> 對尾端多出的欄位較寬容。判讀訊號很明確：ngxtop 顯示 0 records 時，先懷疑的是格式沒對上，而非沒有流量。&lt;/p>
&lt;h2 id="何時用終端機看請求何時不該">何時用終端機看請求、何時不該&lt;/h2>
&lt;p>工具會用之後，真正該分清的是使用時機。監控 nginx 請求依目的走兩條完全不同的路。&lt;/p>
&lt;p>當下排查與 ad-hoc 觀測，用終端機。情境是「伺服器現在很忙，進去看誰在打」「某個 endpoint 的 5xx 突然變多，即時看是哪一條」。這時 GoAccess／ngxtop／&lt;code>tail -f access.log&lt;/code> 直接在那台機器上看當下狀況，是遠端 SSH 除錯的日常，也是這類 TUI 工具的主場。&lt;/p>
&lt;p>持續的生產監控，不用終端機。沒有人 24 小時盯著 GoAccess。生產環境的請求監控走 pipeline：指標面用 nginx 的 &lt;code>stub_status&lt;/code>（基礎）或 VTS 模組／&lt;code>nginx-prometheus-exporter&lt;/code>（細到 per-status、per-upstream 的請求率），由 Prometheus 抓、Grafana 畫儀表板並設告警；日誌面把 access log 送到 Loki／ELK／Datadog 之類做查詢與長期保存。&lt;/p>
&lt;p>分界濃縮成一句：終端機 TUI 答「這台機器現在怎樣」，pipeline 答「趨勢如何、超標叫我」。所以請求一直都有被監控，只是持續監控的那份在 Prometheus 與日誌平台、不在終端機。生產 pipeline 的設計（metrics、dashboard、SLO、告警與 vendor 選型）屬後端觀測性的範圍，見 &lt;a href="https://tarrragon.github.io/blog/backend/04-observability/" data-link-title="模組四：可觀測性平台" data-link-desc="整理 log、metric、trace、dashboard 與 alert 的後端操作實務">可觀測性平台&lt;/a>；當排查升級成事故、需要止血與復盤的協作流程時，見 &lt;a href="https://tarrragon.github.io/blog/backend/08-incident-response/" data-link-title="模組八：事故處理與復盤" data-link-desc="用 IR 領域詞彙建問題節點、以服務級案例庫累積事故脈絡，先建概念與案例庫再進實作交接">事故處理與復盤&lt;/a>。&lt;/p></description><content:encoded><![CDATA[<p>Web 伺服器日誌監控工具把 nginx／Apache 的 access log 解析成終端機可讀的請求統計，讓遠端 SSH 進去的那台機器上，能即時看到現在誰在打、打哪些路徑、回什麼狀態碼、吃多少頻寬。它跟系統監控（<code>btop</code> 看 CPU／記憶體）的差別在於觀測對象：系統監控看主機資源，這類看的是 HTTP 請求流。</p>
<p>本文承接 <a href="/blog/linux/tools/cli/cli-graphical-tools-overview/" data-link-title="終端機圖形化工具總覽：遠端操作下的 TUI、文字圖表與多工器" data-link-desc="在純文字終端機裡用 ASCII 與製圖字元做出監控儀表板、資料圖表與多視窗操作的工具總覽，並針對 SSH 伺服器、手機平板、低頻寬三種遠端情境給出選型判讀。">終端機圖形化工具總覽</a> 的 TUI 工具脈絡，屬監控的 web 請求子題。但比起工具本身，更該先分清的是「什麼時候用終端機看請求、什麼時候不該」，這放在最後一節。</p>
<h2 id="goaccess即時請求儀表板">GoAccess：即時請求儀表板</h2>
<p><code>GoAccess</code> 把 access log 解析成全螢幕的即時儀表板，責任是把一份 log 變成可讀的請求分析：狀態碼分布、top 請求路徑、不重複訪客、頻寬、回應時間、訪客的 OS 與瀏覽器。它既能開互動 TUI，也能輸出 HTML／CSV／JSON 報表。</p>
<p>驗證它解析的正確性可以走非互動模式 — 餵一份 nginx access log、指定格式、輸出報表：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">goaccess access.log --log-format<span class="o">=</span>COMBINED -o report.html</span></span></code></pre></div><p><code>--log-format=COMBINED</code> 是對應 nginx 標準 combined 格式的預設。實測對一份 13 筆請求的 log，GoAccess 正確分出 9 筆 2xx、4 筆 4xx，並列出 top 路徑（<code>/</code> 佔多數、<code>/missing</code> 等 404）、訪客 host、user-agent 與頻寬。互動模式（不加 <code>-o</code>）則是同一份資料的全螢幕即時版，連線中持續更新。</p>
<h2 id="ngxtoptop-風格的請求即時表">ngxtop：top 風格的請求即時表</h2>
<p><code>ngxtop</code> 把 access log 做成 <code>top</code> 風格的即時表，責任是用最精簡的版面看「現在最熱的請求路徑與其狀態碼分布」。它比 GoAccess 輕、聚焦在請求路徑與狀態碼，適合快速掃一眼。</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">ngxtop -l access.log --no-follow</span></span></code></pre></div><p><code>--no-follow</code> 處理現有 log 後就退出（預設會持續跟隨新進的 log）。</p>
<p>這裡有一個實測會撞到的 gotcha：<strong>ngxtop 的 log 格式要跟實際的 nginx log_format 完全對上，否則它靜默回 0 records</strong>。nginx 官方 image 的預設 log_format 在標準 combined 之後多了一個 <code>&quot;$http_x_forwarded_for&quot;</code> 欄位，ngxtop 的預設格式不含它，結果就是「跑得起來、但一筆都沒解析到」。對策是用 <code>-f</code> 餵實際的格式：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">ngxtop -l access.log --no-follow <span class="se">\
</span></span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="se"></span>  -f <span class="s1">&#39;$remote_addr - $remote_user [$time_local] &#34;$request&#34; $status $body_bytes_sent &#34;$http_referer&#34; &#34;$http_user_agent&#34; &#34;$http_x_forwarded_for&#34;&#39;</span></span></span></code></pre></div><p>格式對上後，ngxtop 正確處理 13 筆、分出 9 筆 2xx 與 4 筆 4xx，跟 GoAccess 的結果一致。相較之下 GoAccess 的 <code>--log-format=COMBINED</code> 對尾端多出的欄位較寬容。判讀訊號很明確：ngxtop 顯示 0 records 時，先懷疑的是格式沒對上，而非沒有流量。</p>
<h2 id="何時用終端機看請求何時不該">何時用終端機看請求、何時不該</h2>
<p>工具會用之後，真正該分清的是使用時機。監控 nginx 請求依目的走兩條完全不同的路。</p>
<p>當下排查與 ad-hoc 觀測，用終端機。情境是「伺服器現在很忙，進去看誰在打」「某個 endpoint 的 5xx 突然變多，即時看是哪一條」。這時 GoAccess／ngxtop／<code>tail -f access.log</code> 直接在那台機器上看當下狀況，是遠端 SSH 除錯的日常，也是這類 TUI 工具的主場。</p>
<p>持續的生產監控，不用終端機。沒有人 24 小時盯著 GoAccess。生產環境的請求監控走 pipeline：指標面用 nginx 的 <code>stub_status</code>（基礎）或 VTS 模組／<code>nginx-prometheus-exporter</code>（細到 per-status、per-upstream 的請求率），由 Prometheus 抓、Grafana 畫儀表板並設告警；日誌面把 access log 送到 Loki／ELK／Datadog 之類做查詢與長期保存。</p>
<p>分界濃縮成一句：終端機 TUI 答「這台機器現在怎樣」，pipeline 答「趨勢如何、超標叫我」。所以請求一直都有被監控，只是持續監控的那份在 Prometheus 與日誌平台、不在終端機。生產 pipeline 的設計（metrics、dashboard、SLO、告警與 vendor 選型）屬後端觀測性的範圍，見 <a href="/blog/backend/04-observability/" data-link-title="模組四：可觀測性平台" data-link-desc="整理 log、metric、trace、dashboard 與 alert 的後端操作實務">可觀測性平台</a>；當排查升級成事故、需要止血與復盤的協作流程時，見 <a href="/blog/backend/08-incident-response/" data-link-title="模組八：事故處理與復盤" data-link-desc="用 IR 領域詞彙建問題節點、以服務級案例庫累積事故脈絡，先建概念與案例庫再進實作交接">事故處理與復盤</a>。</p>
<h2 id="下一步路由">下一步路由</h2>
<ul>
<li>系統資源（CPU／記憶體／磁碟）的即時監控：<a href="/blog/linux/tools/cli/tui-monitoring-tools/" data-link-title="TUI 監控工具：btop、htop、k9s 的遠端使用與刷新率調校" data-link-desc="全螢幕 TUI 監控工具在遠端 SSH 情境的使用：htop 進程操作、btop 多資源儀表板、k9s 管 Kubernetes，以及慢速連線下刷新率與頻寬的取捨。">TUI 監控工具</a>。</li>
<li>把即時觀測擺進可持久化的多工器 pane：<a href="/blog/linux/tools/cli/tmux-persistence-and-basics/" data-link-title="tmux 基礎：遠端 session 持久化與基本操作" data-link-desc="tmux 終端機多工器的遠端使用核心：detach/reattach 讓 session 脫離連線生命週期、prefix key 與 window/pane 操作、手機友善的快捷鍵調校，以及 tmux 與 zellij 的選型對照。">tmux 基礎</a>。</li>
<li>這類工具在遠端工具分類中的定位：<a href="/blog/linux/tools/cli/cli-graphical-tools-overview/" data-link-title="終端機圖形化工具總覽：遠端操作下的 TUI、文字圖表與多工器" data-link-desc="在純文字終端機裡用 ASCII 與製圖字元做出監控儀表板、資料圖表與多視窗操作的工具總覽，並針對 SSH 伺服器、手機平板、低頻寬三種遠端情境給出選型判讀。">終端機圖形化工具總覽</a>。</li>
</ul>
]]></content:encoded></item><item><title>終端機圖形化工具總覽：遠端操作下的 TUI、文字圖表與多工器</title><link>https://tarrragon.github.io/blog/linux/tools/cli/cli-graphical-tools-overview/</link><pubDate>Mon, 15 Jun 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/linux/tools/cli/cli-graphical-tools-overview/</guid><description>&lt;p>終端機圖形化工具，是用純文字字元（ASCII 與 Unicode 製圖字元）在終端機裡畫出可讀介面的一類程式，承擔的責任是讓遠端操作不必依賴桌面圖形環境就能監控系統、判讀資料與管理多個工作流。它們傳輸的全是文字，所以在頻寬低、連線不穩、只有一支手機的情境下，反而比真正的圖形介面更可靠。&lt;/p>
&lt;p>這類工具常被誤解成「把圖片塞進終端機」。那是另一條技術路線（sixel、kitty 影像協定、&lt;code>chafa&lt;/code> 把 PNG 轉成色塊），依賴特定終端機支援、傳輸量大，在低頻寬遠端會卡。本篇談的是另一條路線：用 &lt;code>─│┌┐└┘&lt;/code> 這類製圖字元、用半形與全形方塊堆出長條圖、用 sparkline 點陣畫趨勢線。畫面本質仍是一段文字，任何能顯示文字的終端機都能呈現。&lt;/p>
&lt;h2 id="為什麼遠端操作特別需要這條路線">為什麼遠端操作特別需要這條路線&lt;/h2>
&lt;p>遠端操作的核心限制是頻寬與連線穩定度，而純文字介面正好把這兩個成本壓到最低。一個全螢幕的監控介面，每次刷新送出的是一整片字元矩陣；若改用影像協定，送出的是一張壓縮點陣圖，資料量通常相差一個量級以上（實際視壓縮率而定）。連線中斷時，文字介面只要重連就能重畫，影像協定則可能因終端機狀態錯亂而花屏。&lt;/p>
&lt;p>這條路線也避開了環境依賴。遠端伺服器通常沒有桌面環境，X11 forwarding 設定繁瑣又吃頻寬；手機上的 SSH app（Termius、Blink、JuiceSSH）能穩定顯示的就是文字。把操作介面建立在文字之上，等於把「能不能用」的前提降到「終端機能顯示字」，這是所有遠端通道都滿足的最低標準。&lt;/p>
&lt;h2 id="六類工具的定位">六類工具的定位&lt;/h2>
&lt;p>終端機圖形化工具依本篇關注的責任分六類，各自解決遠端操作的不同問題。這裡聚焦「監控判讀、資料可視化、多工承載、檔案瀏覽、資料庫存取、訊息佇列存取」六種責任；fuzzy finder（&lt;code>fzf&lt;/code>）等其他互動式 TUI 同屬純文字遠端路線、但責任不同，不在本篇的選型框架內。&lt;/p>
&lt;h3 id="tui-監控與儀表板">TUI 監控與儀表板&lt;/h3>
&lt;p>TUI（Text User Interface）監控工具負責把系統即時狀態畫成全螢幕的互動介面，省去反覆敲 &lt;code>ps&lt;/code>、&lt;code>df&lt;/code>、&lt;code>free&lt;/code> 再自行拼湊的步驟，一眼呈現 CPU、記憶體、磁碟、網路的即時變化。它用製圖字元畫出框線與長條，用顏色標出負載高低，並接受鍵盤操作來排序、過濾、殺進程。&lt;/p>
&lt;p>&lt;code>btop&lt;/code> 與 &lt;code>htop&lt;/code> 是系統層的代表：開起來就是一片帶長條圖的進程清單，可以直接選中進程送訊號。&lt;code>k9s&lt;/code> 把這套搬到 Kubernetes，用同樣的全螢幕互動瀏覽 pod、查 log、進 container。&lt;code>lazygit&lt;/code> 把 git 的暫存、commit、分支操作變成可點選的面板。&lt;code>ncdu&lt;/code> 與 &lt;code>gdu&lt;/code> 掃描磁碟並用長條畫出每個目錄佔多少空間，找出爆掉的是哪一包。&lt;/p>
&lt;p>這類工具的共同判讀訊號是：需求落在「即時狀態 + 立刻操作」、而非「事後分析一段歷史資料」時，TUI 監控是對的選擇。它的邊界在於刷新成本 — 全螢幕重畫在慢速連線上會明顯延遲，這點在後面遠端情境會展開。&lt;/p>
&lt;h3 id="ascii-與文字圖表">ASCII 與文字圖表&lt;/h3>
&lt;p>文字圖表工具負責把一串數值畫成終端機裡的圖，讓趨勢與分布可視化，而不必把資料下載回本機開試算表。它接受標準輸入或檔案的數字，輸出長條圖、折線圖或 sparkline，全部由字元構成。&lt;/p>
&lt;p>&lt;code>gnuplot&lt;/code> 是老牌繪圖工具，設定 &lt;code>set terminal dumb&lt;/code> 就會用 ASCII 畫折線圖，適合畫函數或一段時間序列。&lt;code>termgraph&lt;/code> 吃一份「標籤 + 數值」就畫出橫向長條圖，看各分類佔比很直接。&lt;code>plotext&lt;/code> 是 Python 函式庫，在腳本裡直接畫折線與散點，適合接在資料處理流程後面。&lt;code>youplot&lt;/code>（&lt;code>uplot&lt;/code>）能從 pipeline 即時吃資料畫圖，配合 &lt;code>tail -f&lt;/code> 可以做出滾動更新的監控線。sparkline 類工具（如 &lt;code>spark&lt;/code>）把一串數字壓成一行高低起伏的點陣，塞進狀態列或 log 裡都行。&lt;/p>
&lt;p>這類工具的判讀訊號是：手上已經有一串數值（log 抽出來的延遲、監控匯出的指標、一個查詢的結果），想看形狀而非逐筆讀數字。它跟 TUI 監控的差別在於資料來源 — TUI 監控自己去抓系統即時狀態，文字圖表則是餵什麼畫什麼，適合畫自訂指標與歷史資料。&lt;/p>
&lt;h3 id="終端機多工器">終端機多工器&lt;/h3>
&lt;p>終端機多工器負責在單一連線裡管理多個終端機 session，並讓 session 的生命週期脫離連線本身。它把畫面切成多個 pane、用分頁組織工作流，而最關鍵的是：連線斷了，伺服器上的 session 仍在跑，重連後 attach 回去就接續原狀。&lt;/p>
&lt;p>&lt;code>tmux&lt;/code> 是事實標準，幾乎每台伺服器都裝得到，設定檔成熟、資源佔用低。&lt;code>zellij&lt;/code> 是較新的選擇，預設就有畫面提示（floating pane、操作提示列），對不熟快捷鍵的人上手較快，並內建 layout 設定能一鍵開出固定的多 pane 佈局。&lt;/p>
&lt;p>多工器跟前兩類不同，它本身不畫資料圖，而是承載其他工具的容器：在一個 pane 跑 &lt;code>btop&lt;/code>、另一個 pane 跑 &lt;code>tail -f&lt;/code> 接 sparkline、第三個 pane 留著敲指令。對遠端操作來說，它解決的是連線穩定度問題 — 這是手機與低頻寬情境的核心痛點，下一節展開。&lt;/p>
&lt;h3 id="檔案瀏覽與操作">檔案瀏覽與操作&lt;/h3>
&lt;p>檔案管理器負責把目錄結構與檔案內容做成可導航的互動介面，讓遠端只有終端機時也能像 IDE 側邊欄那樣瀏覽、預覽、搬移檔案，取代反覆 &lt;code>ls&lt;/code>、&lt;code>cd&lt;/code>、&lt;code>cat&lt;/code>。&lt;/p>
&lt;p>&lt;code>broot&lt;/code> 用可展開的樹狀檢視呈現目錄層級，配模糊跳轉適合深層結構；&lt;code>yazi&lt;/code> 與 &lt;code>ranger&lt;/code> 走 Miller 欄狀（並列父目錄、當前目錄、預覽窗），邊瀏覽邊看內容。&lt;/p>
&lt;p>這類工具的判讀訊號是：需求落在檔案層級的導覽與操作，而非系統監控或畫圖。選型與依賴注意事項見 &lt;a href="https://tarrragon.github.io/blog/linux/tools/cli/file-manager-tuis/" data-link-title="終端機檔案管理器：broot、yazi、ranger 的遠端瀏覽與選型" data-link-desc="在純文字終端機用 TUI 檔案管理器像 IDE 側邊欄那樣瀏覽目錄、預覽檔案內容：樹狀（broot）與 Miller 欄狀（yazi/ranger）兩種介面範式的差異，以及遠端 SSH 情境下的選型與依賴注意事項。">終端機檔案管理器&lt;/a>。&lt;/p>
&lt;h3 id="資料庫存取">資料庫存取&lt;/h3>
&lt;p>資料庫客戶端負責把 DB 的 schema、表格與查詢結果做成文字介面，讓遠端只有終端機時也能連到資料庫瀏覽資料、跑查詢，取代把連線資訊餵給桌面 GUI（DBeaver、TablePlus）。&lt;/p>
&lt;p>它分兩種範式：全螢幕 TUI（&lt;code>harlequin&lt;/code> 的 SQL IDE 風、&lt;code>lazysql&lt;/code> 的瀏覽器風）把 schema 樹、編輯器、結果表排進面板；增強型 REPL（&lt;code>pgcli&lt;/code> / &lt;code>litecli&lt;/code>）仍是行式打 SQL、但補上語法高亮與智能補全。&lt;/p>
&lt;p>這類工具的判讀訊號是：需求落在連資料庫做事，而非看系統或檔案。選型與連線注意事項見 &lt;a href="https://tarrragon.github.io/blog/linux/tools/cli/sql-database-clients/" data-link-title="終端機 SQL 客戶端：harlequin、lazysql 與 pgcli/litecli 的選型" data-link-desc="在純文字終端機連資料庫、跑查詢、看結果的客戶端：全螢幕 TUI（harlequin IDE 風、lazysql 瀏覽器風）與增強型 REPL（pgcli/litecli）兩種範式，以及遠端連線的 SSL driver gotcha。">終端機 SQL 客戶端&lt;/a>。&lt;/p>
&lt;h3 id="訊息佇列存取">訊息佇列存取&lt;/h3>
&lt;p>訊息佇列客戶端負責把 broker 的 topic、partition、consumer group 與訊息內容做成文字介面，讓遠端只有終端機時也能瀏覽訊息流、消費單一 topic、看消費進度，取代把連線資訊餵給桌面工具（Conduktor、RedisInsight）。它跟資料庫客戶端的關鍵差異是多半綁單一 broker 協議：Kafka 的 TUI 不認 AMQP、一個工具連多種 broker 是少數例外。&lt;/p>
&lt;p>它同樣分兩種範式：全螢幕 TUI（Kafka 的 &lt;code>kaskade&lt;/code> 看叢集與消費、&lt;code>yozefu&lt;/code> 用查詢撈 record）把 topic 清單與訊息排進面板；增強型 REPL（Redis 的 &lt;code>iredis&lt;/code>）行式打指令、補上補全與型別感知。&lt;/p></description><content:encoded><![CDATA[<p>終端機圖形化工具，是用純文字字元（ASCII 與 Unicode 製圖字元）在終端機裡畫出可讀介面的一類程式，承擔的責任是讓遠端操作不必依賴桌面圖形環境就能監控系統、判讀資料與管理多個工作流。它們傳輸的全是文字，所以在頻寬低、連線不穩、只有一支手機的情境下，反而比真正的圖形介面更可靠。</p>
<p>這類工具常被誤解成「把圖片塞進終端機」。那是另一條技術路線（sixel、kitty 影像協定、<code>chafa</code> 把 PNG 轉成色塊），依賴特定終端機支援、傳輸量大，在低頻寬遠端會卡。本篇談的是另一條路線：用 <code>─│┌┐└┘</code> 這類製圖字元、用半形與全形方塊堆出長條圖、用 sparkline 點陣畫趨勢線。畫面本質仍是一段文字，任何能顯示文字的終端機都能呈現。</p>
<h2 id="為什麼遠端操作特別需要這條路線">為什麼遠端操作特別需要這條路線</h2>
<p>遠端操作的核心限制是頻寬與連線穩定度，而純文字介面正好把這兩個成本壓到最低。一個全螢幕的監控介面，每次刷新送出的是一整片字元矩陣；若改用影像協定，送出的是一張壓縮點陣圖，資料量通常相差一個量級以上（實際視壓縮率而定）。連線中斷時，文字介面只要重連就能重畫，影像協定則可能因終端機狀態錯亂而花屏。</p>
<p>這條路線也避開了環境依賴。遠端伺服器通常沒有桌面環境，X11 forwarding 設定繁瑣又吃頻寬；手機上的 SSH app（Termius、Blink、JuiceSSH）能穩定顯示的就是文字。把操作介面建立在文字之上，等於把「能不能用」的前提降到「終端機能顯示字」，這是所有遠端通道都滿足的最低標準。</p>
<h2 id="六類工具的定位">六類工具的定位</h2>
<p>終端機圖形化工具依本篇關注的責任分六類，各自解決遠端操作的不同問題。這裡聚焦「監控判讀、資料可視化、多工承載、檔案瀏覽、資料庫存取、訊息佇列存取」六種責任；fuzzy finder（<code>fzf</code>）等其他互動式 TUI 同屬純文字遠端路線、但責任不同，不在本篇的選型框架內。</p>
<h3 id="tui-監控與儀表板">TUI 監控與儀表板</h3>
<p>TUI（Text User Interface）監控工具負責把系統即時狀態畫成全螢幕的互動介面，省去反覆敲 <code>ps</code>、<code>df</code>、<code>free</code> 再自行拼湊的步驟，一眼呈現 CPU、記憶體、磁碟、網路的即時變化。它用製圖字元畫出框線與長條，用顏色標出負載高低，並接受鍵盤操作來排序、過濾、殺進程。</p>
<p><code>btop</code> 與 <code>htop</code> 是系統層的代表：開起來就是一片帶長條圖的進程清單，可以直接選中進程送訊號。<code>k9s</code> 把這套搬到 Kubernetes，用同樣的全螢幕互動瀏覽 pod、查 log、進 container。<code>lazygit</code> 把 git 的暫存、commit、分支操作變成可點選的面板。<code>ncdu</code> 與 <code>gdu</code> 掃描磁碟並用長條畫出每個目錄佔多少空間，找出爆掉的是哪一包。</p>
<p>這類工具的共同判讀訊號是：需求落在「即時狀態 + 立刻操作」、而非「事後分析一段歷史資料」時，TUI 監控是對的選擇。它的邊界在於刷新成本 — 全螢幕重畫在慢速連線上會明顯延遲，這點在後面遠端情境會展開。</p>
<h3 id="ascii-與文字圖表">ASCII 與文字圖表</h3>
<p>文字圖表工具負責把一串數值畫成終端機裡的圖，讓趨勢與分布可視化，而不必把資料下載回本機開試算表。它接受標準輸入或檔案的數字，輸出長條圖、折線圖或 sparkline，全部由字元構成。</p>
<p><code>gnuplot</code> 是老牌繪圖工具，設定 <code>set terminal dumb</code> 就會用 ASCII 畫折線圖，適合畫函數或一段時間序列。<code>termgraph</code> 吃一份「標籤 + 數值」就畫出橫向長條圖，看各分類佔比很直接。<code>plotext</code> 是 Python 函式庫，在腳本裡直接畫折線與散點，適合接在資料處理流程後面。<code>youplot</code>（<code>uplot</code>）能從 pipeline 即時吃資料畫圖，配合 <code>tail -f</code> 可以做出滾動更新的監控線。sparkline 類工具（如 <code>spark</code>）把一串數字壓成一行高低起伏的點陣，塞進狀態列或 log 裡都行。</p>
<p>這類工具的判讀訊號是：手上已經有一串數值（log 抽出來的延遲、監控匯出的指標、一個查詢的結果），想看形狀而非逐筆讀數字。它跟 TUI 監控的差別在於資料來源 — TUI 監控自己去抓系統即時狀態，文字圖表則是餵什麼畫什麼，適合畫自訂指標與歷史資料。</p>
<h3 id="終端機多工器">終端機多工器</h3>
<p>終端機多工器負責在單一連線裡管理多個終端機 session，並讓 session 的生命週期脫離連線本身。它把畫面切成多個 pane、用分頁組織工作流，而最關鍵的是：連線斷了，伺服器上的 session 仍在跑，重連後 attach 回去就接續原狀。</p>
<p><code>tmux</code> 是事實標準，幾乎每台伺服器都裝得到，設定檔成熟、資源佔用低。<code>zellij</code> 是較新的選擇，預設就有畫面提示（floating pane、操作提示列），對不熟快捷鍵的人上手較快，並內建 layout 設定能一鍵開出固定的多 pane 佈局。</p>
<p>多工器跟前兩類不同，它本身不畫資料圖，而是承載其他工具的容器：在一個 pane 跑 <code>btop</code>、另一個 pane 跑 <code>tail -f</code> 接 sparkline、第三個 pane 留著敲指令。對遠端操作來說，它解決的是連線穩定度問題 — 這是手機與低頻寬情境的核心痛點，下一節展開。</p>
<h3 id="檔案瀏覽與操作">檔案瀏覽與操作</h3>
<p>檔案管理器負責把目錄結構與檔案內容做成可導航的互動介面，讓遠端只有終端機時也能像 IDE 側邊欄那樣瀏覽、預覽、搬移檔案，取代反覆 <code>ls</code>、<code>cd</code>、<code>cat</code>。</p>
<p><code>broot</code> 用可展開的樹狀檢視呈現目錄層級，配模糊跳轉適合深層結構；<code>yazi</code> 與 <code>ranger</code> 走 Miller 欄狀（並列父目錄、當前目錄、預覽窗），邊瀏覽邊看內容。</p>
<p>這類工具的判讀訊號是：需求落在檔案層級的導覽與操作，而非系統監控或畫圖。選型與依賴注意事項見 <a href="/blog/linux/tools/cli/file-manager-tuis/" data-link-title="終端機檔案管理器：broot、yazi、ranger 的遠端瀏覽與選型" data-link-desc="在純文字終端機用 TUI 檔案管理器像 IDE 側邊欄那樣瀏覽目錄、預覽檔案內容：樹狀（broot）與 Miller 欄狀（yazi/ranger）兩種介面範式的差異，以及遠端 SSH 情境下的選型與依賴注意事項。">終端機檔案管理器</a>。</p>
<h3 id="資料庫存取">資料庫存取</h3>
<p>資料庫客戶端負責把 DB 的 schema、表格與查詢結果做成文字介面，讓遠端只有終端機時也能連到資料庫瀏覽資料、跑查詢，取代把連線資訊餵給桌面 GUI（DBeaver、TablePlus）。</p>
<p>它分兩種範式：全螢幕 TUI（<code>harlequin</code> 的 SQL IDE 風、<code>lazysql</code> 的瀏覽器風）把 schema 樹、編輯器、結果表排進面板；增強型 REPL（<code>pgcli</code> / <code>litecli</code>）仍是行式打 SQL、但補上語法高亮與智能補全。</p>
<p>這類工具的判讀訊號是：需求落在連資料庫做事，而非看系統或檔案。選型與連線注意事項見 <a href="/blog/linux/tools/cli/sql-database-clients/" data-link-title="終端機 SQL 客戶端：harlequin、lazysql 與 pgcli/litecli 的選型" data-link-desc="在純文字終端機連資料庫、跑查詢、看結果的客戶端：全螢幕 TUI（harlequin IDE 風、lazysql 瀏覽器風）與增強型 REPL（pgcli/litecli）兩種範式，以及遠端連線的 SSL driver gotcha。">終端機 SQL 客戶端</a>。</p>
<h3 id="訊息佇列存取">訊息佇列存取</h3>
<p>訊息佇列客戶端負責把 broker 的 topic、partition、consumer group 與訊息內容做成文字介面，讓遠端只有終端機時也能瀏覽訊息流、消費單一 topic、看消費進度，取代把連線資訊餵給桌面工具（Conduktor、RedisInsight）。它跟資料庫客戶端的關鍵差異是多半綁單一 broker 協議：Kafka 的 TUI 不認 AMQP、一個工具連多種 broker 是少數例外。</p>
<p>它同樣分兩種範式：全螢幕 TUI（Kafka 的 <code>kaskade</code> 看叢集與消費、<code>yozefu</code> 用查詢撈 record）把 topic 清單與訊息排進面板；增強型 REPL（Redis 的 <code>iredis</code>）行式打指令、補上補全與型別感知。</p>
<p>這類工具的判讀訊號是：需求落在連 broker 看訊息與消費狀態，而非連資料庫。選型與實機驗證注意事項見 <a href="/blog/linux/tools/cli/message-queue-tui-clients/" data-link-title="終端機訊息佇列客戶端：Kafka 的 kaskade/yozefu/ktea 與 Redis 的 iredis" data-link-desc="在純文字終端機連 broker、瀏覽 topic、消費訊息、檢視 consumer 狀態的客戶端：Kafka 的全螢幕 TUI（kaskade/yozefu/ktea）、Redis 的增強型 REPL（iredis），以及訊息佇列 TUI 多半綁單一 broker 協議這個跟 SQL 客戶端最大的不同。">終端機訊息佇列客戶端</a>。</p>
<h2 id="三種遠端情境的選型判讀">三種遠端情境的選型判讀</h2>
<p>工具選型要回到實際的連線條件，而不只是比對功能清單。以下對應三種常見的遠端情境，各自的判讀重點與陷阱不同。</p>
<h3 id="ssh-連到-linux-伺服器">SSH 連到 Linux 伺服器</h3>
<p>從本機 SSH 進伺服器，連線通常穩定、頻寬足，瓶頸在於操作要連續、不想每次重連都從頭開始。這個情境的核心配置是「多工器打底 + TUI 監控擺上去」：登入後先 <code>tmux attach</code>（沒有就 <code>tmux new</code>），在固定的 pane 佈局裡跑監控與操作。</p>
<p>這裡的判讀重點是把 session 持久化當成預設習慣，而不是等斷線才後悔。即使連線穩定，把長時間任務（build、資料遷移、<code>tail -f</code> 追 log）放進多工器，就能隨時離開再回來。TUI 監控在這個情境幾乎沒有刷新成本顧慮，<code>btop</code> 開最高刷新率也順，互動功能的排序與殺進程都能放手用。</p>
<p>常見陷阱是把多工器與終端機本身的捲動搞混 — 進了 tmux 後，滑鼠捲動預設是 tmux 在管，要進 copy mode 才能往回看歷史。這是上手期最容易卡住的點，值得一開始就把捲動與複製的快捷鍵設順。</p>
<h3 id="手機或平板遠端">手機或平板遠端</h3>
<p>用手機或平板的 SSH app 連線，限制是螢幕小、虛擬鍵盤難敲組合鍵、連線會隨網路切換而中斷。這個情境最該優先的是多工器的持久化能力：手機從 Wi-Fi 切到行動網路、app 切到背景再回來，連線往往已經斷過一次，沒有多工器就等於每次都重來。</p>
<p>工具選型要往「省版面、少快捷鍵」傾斜。<code>zellij</code> 在這裡比 <code>tmux</code> 友善，因為它把操作提示畫在畫面上，不必硬記組合鍵；但 <code>tmux</code> 若已配好觸控友善的快捷鍵也能勝任。TUI 監控要挑版面能縮的 — <code>htop</code> 在窄螢幕下仍可讀，複雜的多欄儀表板則會被擠到看不清。文字圖表在小螢幕反而有優勢，一行 sparkline 不管螢幕多窄都塞得下。</p>
<p>常見陷阱是組合鍵在虛擬鍵盤上難以輸入。多工器的 prefix key（tmux 預設 <code>Ctrl-b</code>）在手機上很難按，值得改綁成單鍵或螢幕上的快捷按鈕；好的 SSH app 通常提供自訂工具列來補這個缺口。</p>
<h3 id="低頻寬或不穩定連線">低頻寬或不穩定連線</h3>
<p>連線慢或會斷時，限制同時來自頻寬與穩定度，兩者要分開處理。穩定度由多工器解決 — 斷線後 session 還在，這點與情境無關地成立。頻寬則直接決定 TUI 監控能不能用得舒服。</p>
<p>這裡最關鍵的判讀是刷新率與重畫成本的取捨。全螢幕 TUI 每次刷新會重送整片畫面，刷新間隔越短、頻寬負擔越重；把刷新率調快、或工具本身刷新較密時，慢速連線上會看到畫面追不上、按鍵延遲。對策是把刷新間隔調長（多數工具支援，例如 <code>btop</code> 在介面裡可調 <code>update_ms</code>、<code>htop</code> 用 <code>-d</code> 設延遲），用較低的更新頻率換流暢的操作。</p>
<p>判讀的分界是即時性與頻寬的取捨：連線品質好就用全螢幕 TUI 的即時性，品質差就退回低頻率的文字輸出。文字圖表在後者特別划算，因為它是一次性輸出而非持續重畫 — 跑一次 <code>termgraph</code> 印出結果就結束，不佔用持續頻寬；需要持續監控時，「低刷新率的單一數值 + 偶爾印一次 sparkline」往往比全螢幕儀表板更實用。</p>
<h2 id="選型判準與下一步">選型判準與下一步</h2>
<p>把這些工具與三種情境收斂成一條判準鏈：先用多工器解決連線斷續（任何遠端情境都先做這步），再依任務選對應工具 — 即時狀態用 TUI 監控、看歷史數值用文字圖表、找檔案用檔案管理器、連資料庫用 SQL 客戶端、連 broker 看訊息用訊息佇列客戶端，最後依連線品質調整刷新率與版面密度。</p>
<p>這條判準對應的具體工具，在本資料夾逐篇展開安裝、設定與遠端調校的細節：</p>
<ul>
<li>TUI 工具：系統監控（<code>btop</code> / <code>htop</code> / <code>k9s</code>）見 <a href="/blog/linux/tools/cli/tui-monitoring-tools/" data-link-title="TUI 監控工具：btop、htop、k9s 的遠端使用與刷新率調校" data-link-desc="全螢幕 TUI 監控工具在遠端 SSH 情境的使用：htop 進程操作、btop 多資源儀表板、k9s 管 Kubernetes，以及慢速連線下刷新率與頻寬的取捨。">TUI 監控工具</a>；web 請求日誌（<code>GoAccess</code> / <code>ngxtop</code>）見 <a href="/blog/linux/tools/cli/web-server-log-monitoring/" data-link-title="終端機看 nginx 請求：GoAccess、ngxtop 與何時該用 pipeline 而非 TUI" data-link-desc="在終端機即時看 nginx／web 伺服器請求的工具：GoAccess 即時儀表板、ngxtop top 風格，含 log 格式對齊的 gotcha；以及「當下排查用 TUI、持續監控用 metrics pipeline」的使用時機分界。">終端機看 nginx 請求</a>；git 線圖（<code>tig</code> / <code>lazygit</code> / <code>gitui</code>）屬版控子題、見 <a href="/blog/linux/tools/cli/git-line-graph-tools-for-remote-cli/" data-link-title="遠端 CLI 開發的 git 線圖工具選型：tig、lazygit、gitui 與管線增強" data-link-desc="純 CLI、遠端開發情境下查看 git 分支線圖的工具地景，從 tig 唯讀瀏覽到 lazygit/gitui 操作中樞的定位差異，含選型判準與 lazygit 上手、delta side-by-side diff 設定。">遠端 CLI 開發的 git 線圖工具選型</a></li>
<li>文字圖表：<a href="/blog/linux/tools/cli/ascii-charts-in-terminal/" data-link-title="終端機文字圖表：gnuplot、termgraph、plotext 與 sparkline" data-link-desc="把數值畫成終端機文字圖的工具：gnuplot dumb terminal、termgraph 長條圖、plotext 腳本繪圖、sparkline 與 pipeline 即時更新，以及遠端情境下一次性輸出省頻寬的判讀。">終端機文字圖表</a>（<code>gnuplot</code> dumb terminal、<code>termgraph</code> 與 <code>plotext</code> 的資料接法、sparkline 接 pipeline）</li>
<li>多工器：<a href="/blog/linux/tools/cli/tmux-persistence-and-basics/" data-link-title="tmux 基礎：遠端 session 持久化與基本操作" data-link-desc="tmux 終端機多工器的遠端使用核心：detach/reattach 讓 session 脫離連線生命週期、prefix key 與 window/pane 操作、手機友善的快捷鍵調校，以及 tmux 與 zellij 的選型對照。">tmux 基礎</a>（持久化與基本操作）；<code>zellij</code> 的 pane 操作見 <a href="/blog/linux/tools/cli/zellij-pane/" data-link-title="Zellij 多終端機操作指南" data-link-desc="Zellij pane 的佈局查看、內容讀取、大小調整等 CLI 操作方式，適合搭配 AI 工具使用。">Zellij 多終端機操作指南</a>、瀏覽器遠端連線見 <a href="/blog/linux/tools/cli/zellij-remote-web-client/" data-link-title="Zellij Web Client 外網連線教學" data-link-desc="讓他人透過瀏覽器連線到指定的 Zellij session，包含 SSL 憑證申請、防火牆設定、Token 管理等完整步驟。">Zellij Web Client 外網連線教學</a></li>
<li>檔案管理：<a href="/blog/linux/tools/cli/file-manager-tuis/" data-link-title="終端機檔案管理器：broot、yazi、ranger 的遠端瀏覽與選型" data-link-desc="在純文字終端機用 TUI 檔案管理器像 IDE 側邊欄那樣瀏覽目錄、預覽檔案內容：樹狀（broot）與 Miller 欄狀（yazi/ranger）兩種介面範式的差異，以及遠端 SSH 情境下的選型與依賴注意事項。">終端機檔案管理器</a>（<code>broot</code> 樹狀、<code>yazi</code> / <code>ranger</code> Miller 欄狀的選型與依賴）</li>
<li>資料庫客戶端：<a href="/blog/linux/tools/cli/sql-database-clients/" data-link-title="終端機 SQL 客戶端：harlequin、lazysql 與 pgcli/litecli 的選型" data-link-desc="在純文字終端機連資料庫、跑查詢、看結果的客戶端：全螢幕 TUI（harlequin IDE 風、lazysql 瀏覽器風）與增強型 REPL（pgcli/litecli）兩種範式，以及遠端連線的 SSL driver gotcha。">終端機 SQL 客戶端</a>（<code>harlequin</code> IDE 風、<code>lazysql</code> 瀏覽器風、<code>pgcli</code> / <code>litecli</code> 增強 REPL）</li>
<li>訊息佇列客戶端：<a href="/blog/linux/tools/cli/message-queue-tui-clients/" data-link-title="終端機訊息佇列客戶端：Kafka 的 kaskade/yozefu/ktea 與 Redis 的 iredis" data-link-desc="在純文字終端機連 broker、瀏覽 topic、消費訊息、檢視 consumer 狀態的客戶端：Kafka 的全螢幕 TUI（kaskade/yozefu/ktea）、Redis 的增強型 REPL（iredis），以及訊息佇列 TUI 多半綁單一 broker 協議這個跟 SQL 客戶端最大的不同。">終端機訊息佇列客戶端</a>（Kafka 的 <code>kaskade</code> / <code>yozefu</code> / <code>ktea</code>、Redis 的 <code>iredis</code>、與綁單一 broker 協議的選型差異）</li>
</ul>
<p>每篇單工具文章會聚焦一個工具在遠端情境下的實際配置，而不是重述官方手冊。先有這份總覽建立選型框架，再依當下的連線條件挑對應的工具深入。</p>
]]></content:encoded></item><item><title>終端機檔案管理器：broot、yazi、ranger 的遠端瀏覽與選型</title><link>https://tarrragon.github.io/blog/linux/tools/cli/file-manager-tuis/</link><pubDate>Mon, 15 Jun 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/linux/tools/cli/file-manager-tuis/</guid><description>&lt;p>終端機檔案管理器把資料夾結構與檔案內容做成全螢幕互動介面，讓遠端只有終端機時也能像 IDE 側邊欄那樣瀏覽目錄、預覽檔案、搬移與改名，取代反覆 &lt;code>ls&lt;/code>、&lt;code>cd&lt;/code>、&lt;code>cat&lt;/code> 的來回。在純 SSH 情境下，它補上 git 線圖與系統監控之外的另一塊日常需求：檔案層級的導覽與操作。&lt;/p>
&lt;p>本文承接 &lt;a href="https://tarrragon.github.io/blog/linux/tools/cli/cli-graphical-tools-overview/" data-link-title="終端機圖形化工具總覽：遠端操作下的 TUI、文字圖表與多工器" data-link-desc="在純文字終端機裡用 ASCII 與製圖字元做出監控儀表板、資料圖表與多視窗操作的工具總覽，並針對 SSH 伺服器、手機平板、低頻寬三種遠端情境給出選型判讀。">終端機圖形化工具總覽&lt;/a> 的檔案瀏覽分類。&lt;/p>
&lt;h2 id="兩種介面範式樹狀與-miller-欄狀">兩種介面範式：樹狀與 Miller 欄狀&lt;/h2>
&lt;p>檔案管理器的版面分兩種範式，直接決定操作手感，也是「我記得的是哪一個」最快的辨認點。&lt;/p>
&lt;p>樹狀（tree）範式像 IDE 的左側邊欄：一棵可展開、收合的目錄樹，深層結構的層級關係一眼看到。&lt;code>broot&lt;/code> 是代表，它的官方定位就是「tree-like view」，配上模糊輸入過濾能直接跳到深層目錄，&lt;code>--max-depth&lt;/code> 還能控制樹要展開幾層。&lt;/p>
&lt;p>Miller 欄狀（Miller columns）範式像 macOS Finder 的欄狀檢視：並列數欄（父目錄、當前目錄、預覽），游標右移進入子目錄、左移回上層，最右欄即時預覽當前檔案內容。&lt;code>yazi&lt;/code> 與 &lt;code>ranger&lt;/code> 走這條，預覽窗大、適合邊瀏覽邊讀內容。&lt;/p>
&lt;p>辨認方式很單純：記得的是「可展開／收合的樹」就是 broot 這類；記得的是「左邊瀏覽、右邊一大塊預覽」就是 yazi／ranger 這類。&lt;/p>
&lt;h2 id="工具對照">工具對照&lt;/h2>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>工具&lt;/th>
 &lt;th>語言&lt;/th>
 &lt;th>介面範式&lt;/th>
 &lt;th>特色&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;code>broot&lt;/code>&lt;/td>
 &lt;td>Rust&lt;/td>
 &lt;td>可展開樹&lt;/td>
 &lt;td>樹狀 + 模糊跳轉 + 退出時 cd 整合（&lt;code>br&lt;/code>）&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>yazi&lt;/code>&lt;/td>
 &lt;td>Rust&lt;/td>
 &lt;td>Miller 欄狀&lt;/td>
 &lt;td>非同步預覽（圖片／程式碼）、反應最快&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>ranger&lt;/code>&lt;/td>
 &lt;td>Python&lt;/td>
 &lt;td>Miller 欄狀&lt;/td>
 &lt;td>老牌、外掛與設定分享生態最大&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>nnn&lt;/code>&lt;/td>
 &lt;td>C&lt;/td>
 &lt;td>細節／預覽&lt;/td>
 &lt;td>極簡超快、資源佔用低&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>lf&lt;/code>&lt;/td>
 &lt;td>Go&lt;/td>
 &lt;td>Miller 欄狀&lt;/td>
 &lt;td>ranger 風、單一 binary&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>&lt;code>broot&lt;/code> 把目錄做成可展開的樹，輸入幾個字就模糊過濾並跳轉到符合的路徑，是深層 monorepo 裡找檔最快的範式。它的 &lt;code>br&lt;/code> shell function 讓退出時把工作目錄切到所在位置，等於用它當互動式 &lt;code>cd&lt;/code> — 純 &lt;code>broot&lt;/code> 指令做不到這件事，因為子行程改不了父 shell 的目錄。&lt;code>br&lt;/code> 不會自動就位：首次執行 &lt;code>broot&lt;/code> 會跳出提示問是否安裝（答 &lt;code>Y&lt;/code>，或手動跑 &lt;code>broot --install&lt;/code>），它把函式寫進 shell rc，重新載入 rc 後改用 &lt;code>br&lt;/code> 啟動。如果還沒安裝 &lt;code>br&lt;/code>，在 broot 裡按 &lt;code>Alt + Enter&lt;/code>（&lt;code>:cd&lt;/code>）跳轉會看到 &lt;code>This verb needs broot to be launched as br&lt;/code> 的提示 — 這就是還沒透過 &lt;code>br&lt;/code> 啟動的訊號，裝好 &lt;code>br&lt;/code> 並改用 &lt;code>br&lt;/code> 啟動就能跳轉。&lt;/p>
&lt;p>操作上記幾個鍵就夠：直接打字會即時模糊過濾目錄樹，方向鍵移動游標；目錄上 &lt;code>Enter&lt;/code> 進入該層、&lt;code>Alt + Enter&lt;/code>（verb &lt;code>:cd&lt;/code>）離開 broot 並把 shell 切到該目錄、檔案上 &lt;code>Enter&lt;/code> 用預設程式開啟；&lt;code>Ctrl + q&lt;/code> 離開，&lt;code>Esc&lt;/code> 退回上一層狀態。完整快捷鍵與 verb 清單按 &lt;code>?&lt;/code> 叫出。深層結構需要綜觀層級時，樹狀比欄狀直觀。要注意 broot 是導覽與啟動器、不內建文字編輯：改檔得在檔案上開外部編輯器（叫出 &lt;code>$EDITOR&lt;/code>），它的強項在樹狀導覽與跳轉，不在看內容或改內容。&lt;/p>
&lt;p>&lt;code>yazi&lt;/code> 是 Miller 欄狀的現代實作，Rust 寫、預覽走非同步，大目錄或檔案很多時捲動不卡。它的程式碼預覽&lt;strong>內建語法高亮&lt;/strong>（用內建 highlighter、開箱就有彩色，不必另裝相依，實測程式碼確實彩色渲染）；圖片預覽則看終端機支援度（見最後一節）。要的是「邊瀏覽邊看大塊內容」且在意速度時，yazi 最順。&lt;/p>
&lt;p>&lt;code>ranger&lt;/code> 是 Miller 欄狀的老牌，外掛、設定檔分享與教學資源最多。它的取捨在依賴：ranger 是 Python，遠端機器要有 Python runtime，而且較新的 Python 版本會在啟動時印 deprecation 警告（實測 ranger 1.9.4 配 Python 3.14 會噴 &lt;code>SyntaxWarning: 'return' in a 'finally' block&lt;/code>，功能不受影響但訊息惱人）。預覽渲染同樣靠外部相依：ranger 預設的程式碼預覽是&lt;strong>純文字、無語法高亮&lt;/strong>，要彩色得另裝 &lt;code>highlight&lt;/code>、&lt;code>bat&lt;/code> 或 &lt;code>pygments&lt;/code> 並啟用 previewer（實測沒裝這些時就只有純文字，與 yazi 開箱即有高亮形成對比）。生態與依賴是它的一體兩面。&lt;/p>
&lt;p>&lt;code>nnn&lt;/code>（C）與 &lt;code>lf&lt;/code>（Go）走輕量路線，啟動極快、資源佔用低，適合老舊或資源吃緊的機器；&lt;code>lf&lt;/code> 是單一 binary，搬檔即用。&lt;/p>
&lt;h2 id="遠端情境的選型">遠端情境的選型&lt;/h2>
&lt;p>選型回到「要哪種瀏覽範式」加上「目標機器能裝什麼」兩條軸：&lt;/p>
&lt;ul>
&lt;li>想要 IDE 式可展開樹、常跳深層目錄：選 &lt;code>broot&lt;/code>，樹狀加模糊跳轉在深層結構找檔最快。&lt;/li>
&lt;li>想要欄狀導覽加強預覽（看圖、讀程式碼）、在意速度：選 &lt;code>yazi&lt;/code>。&lt;/li>
&lt;li>已有 ranger 習慣或需要特定外掛：選 &lt;code>ranger&lt;/code>，但先確認遠端有 Python、並接受啟動時的警告訊息。&lt;/li>
&lt;li>受限或老舊機器、要單一 binary 搬過去就用：&lt;code>lf&lt;/code>（Go）或 &lt;code>nnn&lt;/code>（C）。&lt;/li>
&lt;/ul>
&lt;p>安裝依賴是遠端的隱性分界。編譯型工具（broot、yazi、lf、nnn）搬一個 binary 就近可用；&lt;code>ranger&lt;/code> 的 Python 依賴在不給裝套件或 Python 版本尷尬的機器上較麻煩。編譯型的單一 binary 仍要留意 glibc／musl 對得上目標系統，這點與 git 工具相同，見 &lt;a href="https://tarrragon.github.io/blog/linux/tools/cli/git-line-graph-tools-for-remote-cli/" data-link-title="遠端 CLI 開發的 git 線圖工具選型：tig、lazygit、gitui 與管線增強" data-link-desc="純 CLI、遠端開發情境下查看 git 分支線圖的工具地景，從 tig 唯讀瀏覽到 lazygit/gitui 操作中樞的定位差異，含選型判準與 lazygit 上手、delta side-by-side diff 設定。">git 線圖工具選型&lt;/a> 的單一 binary 注意事項。&lt;/p></description><content:encoded><![CDATA[<p>終端機檔案管理器把資料夾結構與檔案內容做成全螢幕互動介面，讓遠端只有終端機時也能像 IDE 側邊欄那樣瀏覽目錄、預覽檔案、搬移與改名，取代反覆 <code>ls</code>、<code>cd</code>、<code>cat</code> 的來回。在純 SSH 情境下，它補上 git 線圖與系統監控之外的另一塊日常需求：檔案層級的導覽與操作。</p>
<p>本文承接 <a href="/blog/linux/tools/cli/cli-graphical-tools-overview/" data-link-title="終端機圖形化工具總覽：遠端操作下的 TUI、文字圖表與多工器" data-link-desc="在純文字終端機裡用 ASCII 與製圖字元做出監控儀表板、資料圖表與多視窗操作的工具總覽，並針對 SSH 伺服器、手機平板、低頻寬三種遠端情境給出選型判讀。">終端機圖形化工具總覽</a> 的檔案瀏覽分類。</p>
<h2 id="兩種介面範式樹狀與-miller-欄狀">兩種介面範式：樹狀與 Miller 欄狀</h2>
<p>檔案管理器的版面分兩種範式，直接決定操作手感，也是「我記得的是哪一個」最快的辨認點。</p>
<p>樹狀（tree）範式像 IDE 的左側邊欄：一棵可展開、收合的目錄樹，深層結構的層級關係一眼看到。<code>broot</code> 是代表，它的官方定位就是「tree-like view」，配上模糊輸入過濾能直接跳到深層目錄，<code>--max-depth</code> 還能控制樹要展開幾層。</p>
<p>Miller 欄狀（Miller columns）範式像 macOS Finder 的欄狀檢視：並列數欄（父目錄、當前目錄、預覽），游標右移進入子目錄、左移回上層，最右欄即時預覽當前檔案內容。<code>yazi</code> 與 <code>ranger</code> 走這條，預覽窗大、適合邊瀏覽邊讀內容。</p>
<p>辨認方式很單純：記得的是「可展開／收合的樹」就是 broot 這類；記得的是「左邊瀏覽、右邊一大塊預覽」就是 yazi／ranger 這類。</p>
<h2 id="工具對照">工具對照</h2>
<table>
  <thead>
      <tr>
          <th>工具</th>
          <th>語言</th>
          <th>介面範式</th>
          <th>特色</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>broot</code></td>
          <td>Rust</td>
          <td>可展開樹</td>
          <td>樹狀 + 模糊跳轉 + 退出時 cd 整合（<code>br</code>）</td>
      </tr>
      <tr>
          <td><code>yazi</code></td>
          <td>Rust</td>
          <td>Miller 欄狀</td>
          <td>非同步預覽（圖片／程式碼）、反應最快</td>
      </tr>
      <tr>
          <td><code>ranger</code></td>
          <td>Python</td>
          <td>Miller 欄狀</td>
          <td>老牌、外掛與設定分享生態最大</td>
      </tr>
      <tr>
          <td><code>nnn</code></td>
          <td>C</td>
          <td>細節／預覽</td>
          <td>極簡超快、資源佔用低</td>
      </tr>
      <tr>
          <td><code>lf</code></td>
          <td>Go</td>
          <td>Miller 欄狀</td>
          <td>ranger 風、單一 binary</td>
      </tr>
  </tbody>
</table>
<p><code>broot</code> 把目錄做成可展開的樹，輸入幾個字就模糊過濾並跳轉到符合的路徑，是深層 monorepo 裡找檔最快的範式。它的 <code>br</code> shell function 讓退出時把工作目錄切到所在位置，等於用它當互動式 <code>cd</code> — 純 <code>broot</code> 指令做不到這件事，因為子行程改不了父 shell 的目錄。<code>br</code> 不會自動就位：首次執行 <code>broot</code> 會跳出提示問是否安裝（答 <code>Y</code>，或手動跑 <code>broot --install</code>），它把函式寫進 shell rc，重新載入 rc 後改用 <code>br</code> 啟動。如果還沒安裝 <code>br</code>，在 broot 裡按 <code>Alt + Enter</code>（<code>:cd</code>）跳轉會看到 <code>This verb needs broot to be launched as br</code> 的提示 — 這就是還沒透過 <code>br</code> 啟動的訊號，裝好 <code>br</code> 並改用 <code>br</code> 啟動就能跳轉。</p>
<p>操作上記幾個鍵就夠：直接打字會即時模糊過濾目錄樹，方向鍵移動游標；目錄上 <code>Enter</code> 進入該層、<code>Alt + Enter</code>（verb <code>:cd</code>）離開 broot 並把 shell 切到該目錄、檔案上 <code>Enter</code> 用預設程式開啟；<code>Ctrl + q</code> 離開，<code>Esc</code> 退回上一層狀態。完整快捷鍵與 verb 清單按 <code>?</code> 叫出。深層結構需要綜觀層級時，樹狀比欄狀直觀。要注意 broot 是導覽與啟動器、不內建文字編輯：改檔得在檔案上開外部編輯器（叫出 <code>$EDITOR</code>），它的強項在樹狀導覽與跳轉，不在看內容或改內容。</p>
<p><code>yazi</code> 是 Miller 欄狀的現代實作，Rust 寫、預覽走非同步，大目錄或檔案很多時捲動不卡。它的程式碼預覽<strong>內建語法高亮</strong>（用內建 highlighter、開箱就有彩色，不必另裝相依，實測程式碼確實彩色渲染）；圖片預覽則看終端機支援度（見最後一節）。要的是「邊瀏覽邊看大塊內容」且在意速度時，yazi 最順。</p>
<p><code>ranger</code> 是 Miller 欄狀的老牌，外掛、設定檔分享與教學資源最多。它的取捨在依賴：ranger 是 Python，遠端機器要有 Python runtime，而且較新的 Python 版本會在啟動時印 deprecation 警告（實測 ranger 1.9.4 配 Python 3.14 會噴 <code>SyntaxWarning: 'return' in a 'finally' block</code>，功能不受影響但訊息惱人）。預覽渲染同樣靠外部相依：ranger 預設的程式碼預覽是<strong>純文字、無語法高亮</strong>，要彩色得另裝 <code>highlight</code>、<code>bat</code> 或 <code>pygments</code> 並啟用 previewer（實測沒裝這些時就只有純文字，與 yazi 開箱即有高亮形成對比）。生態與依賴是它的一體兩面。</p>
<p><code>nnn</code>（C）與 <code>lf</code>（Go）走輕量路線，啟動極快、資源佔用低，適合老舊或資源吃緊的機器；<code>lf</code> 是單一 binary，搬檔即用。</p>
<h2 id="遠端情境的選型">遠端情境的選型</h2>
<p>選型回到「要哪種瀏覽範式」加上「目標機器能裝什麼」兩條軸：</p>
<ul>
<li>想要 IDE 式可展開樹、常跳深層目錄：選 <code>broot</code>，樹狀加模糊跳轉在深層結構找檔最快。</li>
<li>想要欄狀導覽加強預覽（看圖、讀程式碼）、在意速度：選 <code>yazi</code>。</li>
<li>已有 ranger 習慣或需要特定外掛：選 <code>ranger</code>，但先確認遠端有 Python、並接受啟動時的警告訊息。</li>
<li>受限或老舊機器、要單一 binary 搬過去就用：<code>lf</code>（Go）或 <code>nnn</code>（C）。</li>
</ul>
<p>安裝依賴是遠端的隱性分界。編譯型工具（broot、yazi、lf、nnn）搬一個 binary 就近可用；<code>ranger</code> 的 Python 依賴在不給裝套件或 Python 版本尷尬的機器上較麻煩。編譯型的單一 binary 仍要留意 glibc／musl 對得上目標系統，這點與 git 工具相同，見 <a href="/blog/linux/tools/cli/git-line-graph-tools-for-remote-cli/" data-link-title="遠端 CLI 開發的 git 線圖工具選型：tig、lazygit、gitui 與管線增強" data-link-desc="純 CLI、遠端開發情境下查看 git 分支線圖的工具地景，從 tig 唯讀瀏覽到 lazygit/gitui 操作中樞的定位差異，含選型判準與 lazygit 上手、delta side-by-side diff 設定。">git 線圖工具選型</a> 的單一 binary 注意事項。</p>
<p>預覽能力有一條邊界要先知道：程式碼與純文字檔的預覽在任何終端機都穩定，但圖片預覽需要終端機支援影像協定（sixel／kitty）。純文字遠端通道下，沒有影像協定時圖片會退回檔名與中繼資訊，這與 <a href="/blog/linux/tools/cli/cli-graphical-tools-overview/" data-link-title="終端機圖形化工具總覽：遠端操作下的 TUI、文字圖表與多工器" data-link-desc="在純文字終端機裡用 ASCII 與製圖字元做出監控儀表板、資料圖表與多視窗操作的工具總覽，並針對 SSH 伺服器、手機平板、低頻寬三種遠端情境給出選型判讀。">總覽</a> 對影像協定的取捨一致。</p>
<h2 id="下一步路由">下一步路由</h2>
<ul>
<li>把檔案管理器擺進可持久化的多工器 pane：<a href="/blog/linux/tools/cli/tmux-persistence-and-basics/" data-link-title="tmux 基礎：遠端 session 持久化與基本操作" data-link-desc="tmux 終端機多工器的遠端使用核心：detach/reattach 讓 session 脫離連線生命週期、prefix key 與 window/pane 操作、手機友善的快捷鍵調校，以及 tmux 與 zellij 的選型對照。">tmux 基礎</a>。</li>
<li>編譯型工具搬到遠端的單一 binary 注意事項：<a href="/blog/linux/tools/cli/git-line-graph-tools-for-remote-cli/" data-link-title="遠端 CLI 開發的 git 線圖工具選型：tig、lazygit、gitui 與管線增強" data-link-desc="純 CLI、遠端開發情境下查看 git 分支線圖的工具地景，從 tig 唯讀瀏覽到 lazygit/gitui 操作中樞的定位差異，含選型判準與 lazygit 上手、delta side-by-side diff 設定。">git 線圖工具選型</a>。</li>
<li>檔案管理在遠端工具分類中的定位：<a href="/blog/linux/tools/cli/cli-graphical-tools-overview/" data-link-title="終端機圖形化工具總覽：遠端操作下的 TUI、文字圖表與多工器" data-link-desc="在純文字終端機裡用 ASCII 與製圖字元做出監控儀表板、資料圖表與多視窗操作的工具總覽，並針對 SSH 伺服器、手機平板、低頻寬三種遠端情境給出選型判讀。">終端機圖形化工具總覽</a>。</li>
</ul>
]]></content:encoded></item><item><title>遠端 CLI 開發的 git 線圖工具選型：tig、lazygit、gitui 與管線增強</title><link>https://tarrragon.github.io/blog/linux/tools/cli/git-line-graph-tools-for-remote-cli/</link><pubDate>Mon, 15 Jun 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/linux/tools/cli/git-line-graph-tools-for-remote-cli/</guid><description>&lt;p>git 線圖工具，是把 commit 的分支、合併與時間先後關係畫成終端機可讀圖形的一類程式，承擔的責任是讓開發者在沒有桌面圖形環境的遠端機器上，仍能看清楚 repo 的歷史結構並進行版控操作。在純 SSH 連線的開發情境下，它取代了 IDE 內建的 git 圖形面板，而傳輸的全是文字，所以在頻寬低、只有終端機的條件下依然可用。&lt;/p>
&lt;p>最基本的線圖能力內建在 git 本身：&lt;code>git log --oneline --decorate --graph&lt;/code> 就會用 ASCII 畫出分支線。Oh My Zsh 的 git plugin 把它包成 &lt;code>glog&lt;/code>（當前分支）與 &lt;code>gloga&lt;/code>（加 &lt;code>--all&lt;/code> 看全分支）兩個 alias。這條 alias 是任何環境都成立的底線 — 即使在一台陌生、不能安裝任何東西的機器上，&lt;code>git log --graph&lt;/code> 永遠都在。專用工具要解決的，是這條底線之上的兩個缺口：互動瀏覽的流暢度，以及把「看」與「改」整合在同一畫面。&lt;/p>
&lt;p>本文承接 &lt;a href="https://tarrragon.github.io/blog/linux/tools/cli/cli-graphical-tools-overview/" data-link-title="終端機圖形化工具總覽：遠端操作下的 TUI、文字圖表與多工器" data-link-desc="在純文字終端機裡用 ASCII 與製圖字元做出監控儀表板、資料圖表與多視窗操作的工具總覽，並針對 SSH 伺服器、手機平板、低頻寬三種遠端情境給出選型判讀。">終端機圖形化工具總覽&lt;/a> 的 TUI 工具脈絡，聚焦 git 線圖這個版控子題（最常被遠端開發者問到）。&lt;/p>
&lt;h2 id="三類工具的職責分工">三類工具的職責分工&lt;/h2>
&lt;p>git 線圖工具依承擔的責任分三類，遠端 CLI 情境下各自適用的條件不同。&lt;/p>
&lt;h3 id="tui-互動式瀏覽與操作">TUI 互動式瀏覽與操作&lt;/h3>
&lt;p>TUI 工具負責把 git 歷史開成全螢幕的互動介面，讓游標在 commit、檔案、分支之間移動，並即時在側欄顯示對應的 diff。它跟單純印一次 log 的差別在於「可導航」— 線圖、diff、blame 在同一個畫面裡用鍵盤切換，不必反覆重打指令。&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>工具&lt;/th>
 &lt;th>語言&lt;/th>
 &lt;th>一句話定位&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;code>tig&lt;/code>&lt;/td>
 &lt;td>C&lt;/td>
 &lt;td>老牌穩定的唯讀瀏覽器（log/diff/blame）&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>lazygit&lt;/code>&lt;/td>
 &lt;td>Go&lt;/td>
 &lt;td>功能最全的操作中樞&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>gitui&lt;/code>&lt;/td>
 &lt;td>Rust&lt;/td>
 &lt;td>精簡高效、大 repo 友善&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>已經在用 &lt;code>tig&lt;/code> 的人，可以把後兩者當成「補上操作能力」而非替換：只想瀏覽就停在 &lt;code>tig&lt;/code>，要用鍵盤完成 stage/commit/rebase 再加 &lt;code>lazygit&lt;/code>，兩者互補。各工具的責任邊界與選型條件在下面逐一展開。&lt;/p>
&lt;p>&lt;code>tig&lt;/code> 的責任邊界在「看」。它把 git 歷史做成可導航的唯讀視圖，線圖呈現清楚、資源佔用極低，適合只想快速翻歷史與看 diff 的情境。它本身不做版控操作，所以心智負擔小、學習成本低。&lt;/p>
&lt;p>&lt;code>lazygit&lt;/code> 把責任從「看」擴到「改」。互動式 rebase、cherry-pick、stash 管理、衝突解決、stage 到 commit 的完整流程都能用鍵盤完成，等於把終端機 git 操作整碗端進一個畫面。它的代價是功能多帶來的學習曲線與稍高的資源佔用。&lt;/p>
&lt;p>&lt;code>gitui&lt;/code> 與 &lt;code>lazygit&lt;/code> 定位相近但取捨相反，刻意保持精簡並換取效能。日常的 stage、commit、branch、stash、blame、log 都涵蓋，但進階流程的覆蓋度不追求面面俱到。它跟 &lt;code>lazygit&lt;/code> 的深入比較放在後面一節。&lt;/p>
&lt;h3 id="純-log-線圖增強走管線零-tui">純 log 線圖增強（走管線、零 TUI）&lt;/h3>
&lt;p>這類工具不開全螢幕介面，而是改善 &lt;code>git log&lt;/code> 一次性輸出的可讀性，責任是讓線圖更清楚、讓 diff 配色更易讀。它走標準輸出與管線，適合接在腳本裡或當成 alias 隨手用。&lt;/p>
&lt;p>&lt;code>git log --graph&lt;/code> 系列（也就是 &lt;code>glog&lt;/code> / &lt;code>gloga&lt;/code>）是這條路線的起點，零安裝、處處可用。&lt;code>git-graph&lt;/code> 是專門產生比內建更清楚的 ASCII 分支線的工具，當內建線圖在複雜合併歷史下變得難讀時，它把分支著色與排版做得更工整。&lt;code>delta&lt;/code> 是 diff 的語法高亮 pager，嚴格說不算線圖工具，但它把 &lt;code>git log -p&lt;/code> 與 &lt;code>git diff&lt;/code> 的輸出做成帶配色、帶行號、可左右並排的版面，常跟前述工具搭配使用 — 後面 lazygit 的 side-by-side diff 就是靠它。&lt;/p>
&lt;p>這類工具的判讀訊號是：需要的是「印一次看一眼」而非持續導航。它對頻寬特別友善，因為是一次性輸出、不像 TUI 會持續重畫畫面。&lt;/p>
&lt;h3 id="桌面-gui遠端通常排除">桌面 GUI（遠端通常排除）&lt;/h3>
&lt;p>&lt;code>gitk&lt;/code>、&lt;code>git-gui&lt;/code>、&lt;code>gitg&lt;/code> 這類桌面圖形工具依賴 X11 或桌面環境，在純終端機的遠端連線下無法直接執行，或需要繁瑣且吃頻寬的 X11 forwarding。這個排除有明確前提：本篇限定「只有終端機、不能在遠端裝 IDE agent」的最小情境。若情境允許 IDE 的 remote 機制（VS Code Remote-SSH、JetBrains Gateway）或可接受 X11 forwarding，桌面 GUI 仍能遠端使用、體驗也不差 — 這條前提放寬時，本篇的結論會跟著變。把 GUI 列在這裡只為說明邊界：它們解決的是「有桌面或 IDE 通道」的需求，與「只有終端機」是不同場景。&lt;/p>
&lt;h2 id="遠端情境為什麼偏好單一-binary">遠端情境為什麼偏好單一 binary&lt;/h2>
&lt;p>遠端開發選型有一個容易被忽略的隱性約束：工具的安裝依賴。Go 與 Rust 寫的工具（&lt;code>lazygit&lt;/code>、&lt;code>gitui&lt;/code>、&lt;code>git-graph&lt;/code>、&lt;code>delta&lt;/code>）通常編譯成單一 binary，相較需要先裝 runtime 的工具，把檔案搬上去就能用，這是它們在 SSH 情境特別受歡迎的原因之一。&lt;/p>
&lt;p>但「單一 binary」要打兩個折扣，照字面 &lt;code>scp&lt;/code> 可能撞牆。其一，binary 自身不含 runtime，不代表沒有執行期依賴：&lt;code>lazygit&lt;/code> 與 &lt;code>gitui&lt;/code> 執行時都會呼叫系統的 &lt;code>git&lt;/code>，遠端機沒裝 git 就跑不動。其二，Rust 工具（&lt;code>gitui&lt;/code> / &lt;code>delta&lt;/code>）預設動態連結 glibc，不是真正的 static；跨發行版或搬進 alpine 容器（用 musl）會出現 &lt;code>GLIBC not found&lt;/code>，這種情境要下載對應的 musl 靜態建置版。判讀的分界是：能用系統套件管理器自由安裝時，依語言寫成什麼影響不大；環境受限時，除了「一個檔案」還要確認目標機有 &lt;code>git&lt;/code>、且 binary 的 libc 對得上目標系統。這也是為什麼 &lt;code>git log --graph&lt;/code> alias 是最後的保命符 — 它連 binary 都不必搬。&lt;/p></description><content:encoded><![CDATA[<p>git 線圖工具，是把 commit 的分支、合併與時間先後關係畫成終端機可讀圖形的一類程式，承擔的責任是讓開發者在沒有桌面圖形環境的遠端機器上，仍能看清楚 repo 的歷史結構並進行版控操作。在純 SSH 連線的開發情境下，它取代了 IDE 內建的 git 圖形面板，而傳輸的全是文字，所以在頻寬低、只有終端機的條件下依然可用。</p>
<p>最基本的線圖能力內建在 git 本身：<code>git log --oneline --decorate --graph</code> 就會用 ASCII 畫出分支線。Oh My Zsh 的 git plugin 把它包成 <code>glog</code>（當前分支）與 <code>gloga</code>（加 <code>--all</code> 看全分支）兩個 alias。這條 alias 是任何環境都成立的底線 — 即使在一台陌生、不能安裝任何東西的機器上，<code>git log --graph</code> 永遠都在。專用工具要解決的，是這條底線之上的兩個缺口：互動瀏覽的流暢度，以及把「看」與「改」整合在同一畫面。</p>
<p>本文承接 <a href="/blog/linux/tools/cli/cli-graphical-tools-overview/" data-link-title="終端機圖形化工具總覽：遠端操作下的 TUI、文字圖表與多工器" data-link-desc="在純文字終端機裡用 ASCII 與製圖字元做出監控儀表板、資料圖表與多視窗操作的工具總覽，並針對 SSH 伺服器、手機平板、低頻寬三種遠端情境給出選型判讀。">終端機圖形化工具總覽</a> 的 TUI 工具脈絡，聚焦 git 線圖這個版控子題（最常被遠端開發者問到）。</p>
<h2 id="三類工具的職責分工">三類工具的職責分工</h2>
<p>git 線圖工具依承擔的責任分三類，遠端 CLI 情境下各自適用的條件不同。</p>
<h3 id="tui-互動式瀏覽與操作">TUI 互動式瀏覽與操作</h3>
<p>TUI 工具負責把 git 歷史開成全螢幕的互動介面，讓游標在 commit、檔案、分支之間移動，並即時在側欄顯示對應的 diff。它跟單純印一次 log 的差別在於「可導航」— 線圖、diff、blame 在同一個畫面裡用鍵盤切換，不必反覆重打指令。</p>
<table>
  <thead>
      <tr>
          <th>工具</th>
          <th>語言</th>
          <th>一句話定位</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>tig</code></td>
          <td>C</td>
          <td>老牌穩定的唯讀瀏覽器（log/diff/blame）</td>
      </tr>
      <tr>
          <td><code>lazygit</code></td>
          <td>Go</td>
          <td>功能最全的操作中樞</td>
      </tr>
      <tr>
          <td><code>gitui</code></td>
          <td>Rust</td>
          <td>精簡高效、大 repo 友善</td>
      </tr>
  </tbody>
</table>
<p>已經在用 <code>tig</code> 的人，可以把後兩者當成「補上操作能力」而非替換：只想瀏覽就停在 <code>tig</code>，要用鍵盤完成 stage/commit/rebase 再加 <code>lazygit</code>，兩者互補。各工具的責任邊界與選型條件在下面逐一展開。</p>
<p><code>tig</code> 的責任邊界在「看」。它把 git 歷史做成可導航的唯讀視圖，線圖呈現清楚、資源佔用極低，適合只想快速翻歷史與看 diff 的情境。它本身不做版控操作，所以心智負擔小、學習成本低。</p>
<p><code>lazygit</code> 把責任從「看」擴到「改」。互動式 rebase、cherry-pick、stash 管理、衝突解決、stage 到 commit 的完整流程都能用鍵盤完成，等於把終端機 git 操作整碗端進一個畫面。它的代價是功能多帶來的學習曲線與稍高的資源佔用。</p>
<p><code>gitui</code> 與 <code>lazygit</code> 定位相近但取捨相反，刻意保持精簡並換取效能。日常的 stage、commit、branch、stash、blame、log 都涵蓋，但進階流程的覆蓋度不追求面面俱到。它跟 <code>lazygit</code> 的深入比較放在後面一節。</p>
<h3 id="純-log-線圖增強走管線零-tui">純 log 線圖增強（走管線、零 TUI）</h3>
<p>這類工具不開全螢幕介面，而是改善 <code>git log</code> 一次性輸出的可讀性，責任是讓線圖更清楚、讓 diff 配色更易讀。它走標準輸出與管線，適合接在腳本裡或當成 alias 隨手用。</p>
<p><code>git log --graph</code> 系列（也就是 <code>glog</code> / <code>gloga</code>）是這條路線的起點，零安裝、處處可用。<code>git-graph</code> 是專門產生比內建更清楚的 ASCII 分支線的工具，當內建線圖在複雜合併歷史下變得難讀時，它把分支著色與排版做得更工整。<code>delta</code> 是 diff 的語法高亮 pager，嚴格說不算線圖工具，但它把 <code>git log -p</code> 與 <code>git diff</code> 的輸出做成帶配色、帶行號、可左右並排的版面，常跟前述工具搭配使用 — 後面 lazygit 的 side-by-side diff 就是靠它。</p>
<p>這類工具的判讀訊號是：需要的是「印一次看一眼」而非持續導航。它對頻寬特別友善，因為是一次性輸出、不像 TUI 會持續重畫畫面。</p>
<h3 id="桌面-gui遠端通常排除">桌面 GUI（遠端通常排除）</h3>
<p><code>gitk</code>、<code>git-gui</code>、<code>gitg</code> 這類桌面圖形工具依賴 X11 或桌面環境，在純終端機的遠端連線下無法直接執行，或需要繁瑣且吃頻寬的 X11 forwarding。這個排除有明確前提：本篇限定「只有終端機、不能在遠端裝 IDE agent」的最小情境。若情境允許 IDE 的 remote 機制（VS Code Remote-SSH、JetBrains Gateway）或可接受 X11 forwarding，桌面 GUI 仍能遠端使用、體驗也不差 — 這條前提放寬時，本篇的結論會跟著變。把 GUI 列在這裡只為說明邊界：它們解決的是「有桌面或 IDE 通道」的需求，與「只有終端機」是不同場景。</p>
<h2 id="遠端情境為什麼偏好單一-binary">遠端情境為什麼偏好單一 binary</h2>
<p>遠端開發選型有一個容易被忽略的隱性約束：工具的安裝依賴。Go 與 Rust 寫的工具（<code>lazygit</code>、<code>gitui</code>、<code>git-graph</code>、<code>delta</code>）通常編譯成單一 binary，相較需要先裝 runtime 的工具，把檔案搬上去就能用，這是它們在 SSH 情境特別受歡迎的原因之一。</p>
<p>但「單一 binary」要打兩個折扣，照字面 <code>scp</code> 可能撞牆。其一，binary 自身不含 runtime，不代表沒有執行期依賴：<code>lazygit</code> 與 <code>gitui</code> 執行時都會呼叫系統的 <code>git</code>，遠端機沒裝 git 就跑不動。其二，Rust 工具（<code>gitui</code> / <code>delta</code>）預設動態連結 glibc，不是真正的 static；跨發行版或搬進 alpine 容器（用 musl）會出現 <code>GLIBC not found</code>，這種情境要下載對應的 musl 靜態建置版。判讀的分界是：能用系統套件管理器自由安裝時，依語言寫成什麼影響不大；環境受限時，除了「一個檔案」還要確認目標機有 <code>git</code>、且 binary 的 libc 對得上目標系統。這也是為什麼 <code>git log --graph</code> alias 是最後的保命符 — 它連 binary 都不必搬。</p>
<h2 id="lazygit-與-gitui-的定位差異">lazygit 與 gitui 的定位差異</h2>
<p><code>lazygit</code> 與 <code>gitui</code> 表面功能重疊度很高，選擇依據主要落在以下幾個面向，而非單純「誰比較快」。</p>
<h3 id="技術底色效能與資源">技術底色：效能與資源</h3>
<p><code>gitui</code> 用 Rust 做了非同步架構，在 monorepo、歷史很長、或機器資源有限（老舊伺服器、容器內）時反應更跟手，啟動極快、記憶體佔用低。<code>lazygit</code> 的效能日常夠用，但在 diff 或 log 非常大時偶有卡頓、記憶體佔用較高。這是兩者最常被提到的分水嶺，也直接對應遠端機器的強弱。</p>
<h3 id="功能廣度-vs-功能聚焦">功能廣度 vs 功能聚焦</h3>
<p>這是比效能更根本的定位差異。<code>lazygit</code> 賭功能廣度：互動式 rebase、cherry-pick、stash 管理、衝突解決、自訂指令幾乎都包了，目標是讓人完全不打 git 指令。<code>gitui</code> 賭功能聚焦：涵蓋 stage、commit、branch、stash、blame、log 這些日常約八成的操作，進階流程（複雜 rebase）的覆蓋度刻意保留，設計上傾向不做太重的事。</p>
<h3 id="選型決策邏輯">選型決策邏輯</h3>
<p>兩者背後是兩種不同的使用意圖。傾向 <code>lazygit</code> 的，是想用一個工具取代 git CLI、把版控操作整碗端進終端機，願意付稍高的資源代價換廣度與便利。傾向 <code>gitui</code> 的，是想要一個快速的 git 視窗，主要看狀態、看歷史、做基本提交，要求即開即用、進階操作仍回去打 git 指令。一句話收斂：<code>lazygit</code> 押廣度與便利，<code>gitui</code> 押速度與輕量。</p>
<h3 id="生態與社群">生態與社群</h3>
<p><code>lazygit</code> 社群採用度較高、star 數較多、教學與設定檔分享資源豐富，keybinding 與自訂指令的客製空間大。<code>gitui</code> 社群較小但穩定，定位清晰。對需要大量客製或想參考他人設定的情境，<code>lazygit</code> 的生態是實質優勢。長期依賴前也值得瞄一眼維護活躍度（release 節奏決定 bug 修復速度）— 兩者都在活躍維護，但 star 數高不等於修得快，這跟社群熱度是兩件事。</p>
<h2 id="選型判準遠端-cli-情境">選型判準（遠端 CLI 情境）</h2>
<p>把上述收斂成一條判準鏈，對應遠端開發的機器條件：</p>
<ul>
<li>機器資源充足、想要一個工具搞定所有 git 操作：選 <code>lazygit</code>，把它當操作中樞。</li>
<li>遠端機器較弱、repo 很大、或只想快速看狀態做提交：選 <code>gitui</code>，換取即開即用與低資源。粗略 tripwire：repo 歷史上萬筆 / monorepo、機器 RAM 約 1GB 以下、或 <code>lazygit</code> 開大 diff 時明顯卡頓，就往 <code>gitui</code> 靠。</li>
<li>只需要看歷史與 diff、不在工具裡做版控操作：<code>tig</code> 的唯讀定位最輕量。</li>
<li>環境受限、不能安裝：退回 <code>gloga</code>（<code>git log --graph --all</code>），它在任何 git 環境都成立。</li>
</ul>
<p>這四者能共存。常見的搭配是 <code>tig</code> 看歷史 + <code>lazygit</code> 做操作，兩者互補性高；<code>gitui</code> 與 <code>tig</code> 的瀏覽定位略有重疊，同時留兩個的理由較弱。風險與邊界在於學習成本：操作中樞型工具按一個鍵就改動 repo，初期適合先在拋棄式分支或測試 repo 練手，熟悉後再用到開發分支。</p>
<h2 id="lazygit-上手與-side-by-side-diff">lazygit 上手與 side-by-side diff</h2>
<p><code>lazygit</code> 的介面遵循一個固定心法：左側面板選「對什麼東西操作」、右側看「內容」、底部提示列顯示「當前能按什麼」。底部提示列會隨游標位置動態變化，所以操作不必背全部快捷鍵，迷路時按 <code>?</code> 會叫出當前面板的上下文敏感說明。</p>
<p>入門只需記幾個導航鍵：<code>Tab</code> 或數字 <code>1</code>~<code>5</code> 切換左側面板（Status / Files / Branches / Commits / Stash），方向鍵或 <code>hjkl</code> 在面板與清單內移動，<code>Esc</code> 返回上一層，<code>q</code> 離開。線圖在 <code>Commits</code> 面板（按 <code>4</code>），全分支關係在 <code>Branches</code> 面板（按 <code>3</code>）。三個最常用的日常操作：在 <code>Files</code> 面板用空白鍵 stage / unstage、stage 完按 <code>c</code> 輸入訊息提交、在 <code>Commits</code> 面板選 commit 後右側自動顯示 diff（<code>Enter</code> 進入檔案層級）。</p>
<p>預設的 diff 是單欄 unified（增刪行逐行上下排列）呈現。要做到像 IDE 那樣左右並排（side-by-side）對齊，<code>lazygit</code> 本身沒有內建這個視圖，需要外接 pager。pager 是負責把長輸出分頁、上色顯示的程式（git 預設用 <code>less</code>）；這裡讓 <code>lazygit</code> 把 diff 文字交給外部 pager 上色並重排成並排版面，最常見的搭配是 <code>delta</code>。安裝 <code>delta</code> 後，在 <code>lazygit</code> 設定檔（<code>~/Library/Application Support/lazygit/config.yml</code>，或 <code>~/.config/lazygit/config.yml</code>）指定它當 pager 並開啟並排模式：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="ln">1</span><span class="cl"><span class="nt">git</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="w">  </span><span class="nt">pagers</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="ln">3</span><span class="cl"><span class="w">    </span>- <span class="nt">colorArg</span><span class="p">:</span><span class="w"> </span><span class="l">always</span><span class="w">
</span></span></span><span class="line"><span class="ln">4</span><span class="cl"><span class="w">      </span><span class="nt">pager</span><span class="p">:</span><span class="w"> </span><span class="l">delta --dark --paging=never --side-by-side</span></span></span></code></pre></div><p><code>--side-by-side</code> 是讓 <code>delta</code> 左右並排的關鍵旗標，<code>--paging=never</code> 讓 <code>delta</code> 只負責上色與排版、捲動分頁仍由 <code>lazygit</code> 處理。<code>git.pagers</code>（list）是現行 lazygit 的設定鍵；舊版的 <code>git.paging.pager</code>（單數）仍可用，新版啟動時會自動 migrate 成上面的形式並改寫設定檔。在窄螢幕（手機、平板遠端）下，並排會把每欄壓得很窄，這種情境改回垂直單欄反而好讀 — side-by-side 的適用條件是螢幕夠寬。</p>
<h2 id="下一步路由">下一步路由</h2>
<p>選型確定後，後續深入的方向：</p>
<ul>
<li>想完全用鍵盤取代 git 指令：深入 <code>lazygit</code> 的互動式 rebase、cherry-pick 與自訂指令流程。</li>
<li>遠端機器資源吃緊：實測 <code>gitui</code> 在大型 repo 的反應，跟 <code>lazygit</code> 同一個 repo 跑一次比較體感。</li>
<li>diff 配色與並排需求延伸到日常 git：把 <code>delta</code> 設成 git 全域 pager（<code>git config --global core.pager delta</code>），讓 <code>git diff</code> 與 <code>git log -p</code> 也吃到同一套配色。</li>
</ul>
<p>git 線圖在整個遠端 CLI 工具選型中的位置，見 <a href="/blog/linux/tools/cli/cli-graphical-tools-overview/" data-link-title="終端機圖形化工具總覽：遠端操作下的 TUI、文字圖表與多工器" data-link-desc="在純文字終端機裡用 ASCII 與製圖字元做出監控儀表板、資料圖表與多視窗操作的工具總覽，並針對 SSH 伺服器、手機平板、低頻寬三種遠端情境給出選型判讀。">終端機圖形化工具總覽</a> — 本篇屬其中的版控子題、與系統監控的 TUI 工具脈絡相承。</p>
]]></content:encoded></item></channel></rss>