命令行界面

命令行界面（Command-line interface，縮寫：CLI）是在圖形使用者界面得到普及之前使用最為廣泛的使用者界面，它通常不支持滑鼠，使用者通過鍵盤輸入指令，電腦接收到指令後，予以執行。也有人稱之為文字使用者界面（character user interface, CUI）。在更廣的意義上，命令行界面也可以指應用程式、程式語言解釋器、資料庫、網路設備或遠程管理系統所提供的文字命令入口；使用者輸入的每一條命令通常被組織成一行文本，再由命令行解釋器、應用程式或作業系統進行解析和執行。SQLite 官方文檔即把 `sqlite3` 程序稱為一種命令行程序或 CLI，它接受使用者輸入並將請求交給 SQLite 庫求值。

## 簡介

通常認為，命令行界面（CLI）沒有圖形使用者界面（GUI）那麼方便使用者操作。因為，命令行界面的軟體通常需要使用者記憶操作的命令，但是，由於其本身的特點，命令行界面要較圖形使用者界面節約電腦系統的資源。在熟記命令的前提下，使用命令行界面往往要較使用圖形使用者界面的操作速度要快。所以，在現在的圖形使用者界面的作業系統中，通常都保留著可選的命令行界面。

雖然現在許多電腦系統都提供了圖形化的操作方式，但是卻都沒有因而停止提供文字模式的命令行操作方式，相反的，許多系統反而更加強化這部分的功能，例如Windows就不只加強了操作命令的功能和數量，也一直在改善 Shell Programming 的方式。而之所以要加強、改善，自然是因為不夠好；作業系統的圖形化操作方式對單一客戶端電腦的操作，已經相當方便，但如果是一群客戶端電腦，或者是24小時運作的伺服器電腦及路由器、交換器等電信設備，圖形化操作方式有時會力有未逮，所以需要不斷增強命令行界面的腳本語言和宏語言來提供豐富的控制與自動化的系統管理能力，例如 Linux 系統的Bash或是 Windows 系統的Windows PowerShell。

命令行界面通常由提示符、命令、參數、選項和輸出構成。提示符表示系統已經準備好接受輸入；命令表示使用者要求執行的動作；參數通常指定被操作的文件、目錄、主機、資料庫或其他對象；選項則改變命令的具體行為。GNU Bash 手冊把 Bash 定義為 GNU 作業系統的 shell 或命令語言解釋器，並說明 Unix shell 同時是命令解釋器和一種程序設計語言，既能作為使用者界面調用工具，也能把這些工具組合成腳本。

命令行界面的重要特點是可組合性和可重複性。許多命令本身只完成較小的任務，但可通過管道、重定向、環境變量、別名、函數和腳本組合成複雜流程。命令文本也便於複製、審計、保存和復現，因此在伺服器管理、軟體開發、科學計算、持續集成、容器構建和雲平台運維中仍被廣泛使用。

## 歷史

命令行界面並不是從現代終端軟體開始出現的。早期電腦常通過開關、指示燈、穿孔卡片或批處理方式運行程序，使用者不一定能直接與正在運行的程序交互。電腦歷史博物館記載，MIT 的 Whirlwind 電腦在1956年展示了直接鍵盤輸入，這在當時不同於穿孔卡片、撥盤和開關等輸入方式。

20世紀60年代以後，電傳打字機、玻璃終端和影片顯示終端逐漸成為使用者與主機交互的主要設備。隨著分時系統發展，多名使用者可以通過終端同時使用一台大型機，系統因此需要讀取文字命令、識別命令含義並調用對應程序的機制。路易·普贊（Louis Pouzin）在回憶文章中稱，他在 MIT 參與 CTSS 工作時編寫了 RUNCOM，用於執行包含命令的文件並進行參數替換；電腦歷史博物館也介紹說，普贊為簡化重複命令輸入創建了 RUNCOM，並把這類程序稱為「shell」。

Multics、Unix等分時作業系統進一步發展了 shell 的概念。Unix 把命令、文件、管道、重定向和腳本組合成較一致的使用者環境，使得小工具能夠相互連接，形成複雜的數據處理流程。到20世紀70年代和80年代，CP/M、MS-DOS、Apple II BASIC 解釋器等微型計算機環境也大多以命令行為主要入口。

20世紀80年代以後，Apple Lisa、Macintosh和Microsoft Windows等系統推動圖形使用者界面進入個人電腦市場。命令行在普通使用者日常操作中的中心地位下降，但沒有消失。微軟文檔說明，受支持的 Windows 與 Windows Server 版本內置一組 Win32 控制台命令，既可單獨使用，也可藉助腳本或腳本工具自動化任務。

21世紀後，命令行環境繼續現代化。PowerShell 被微軟定義為由命令行 shell、腳本語言和配置管理框架組成的跨平台任務自動化解決方案；與傳統純文本管道不同，PowerShell 以 .NET 對象為輸入和輸出的重要基礎。在 macOS 中，Apple 支持文檔說明，現代 macOS 終端的默認 shell 是 zsh，使用者也可更改新終端窗口或標籤頁使用的 shell。

## 與圖形使用者界面的比較

命令行界面和圖形使用者界面並非簡單的先進與落後關係。圖形使用者界面通過圖標、菜單、按鈕和窗口降低學習門檻，適合探索式操作、視覺編輯和普通使用者日常使用。命令行界面則要求使用者知道命令名稱、參數語法、路徑寫法和錯誤信息含義，對初學者並不直觀。

命令行界面的優勢主要體現在精確、輕量和可自動化。命令是文字，便於複製、保存、搜索、審計和在不同機器上復現；命令可以寫入腳本，適合批量處理和重複任務；遠程管理時，命令行通常比圖形界面占用更少帶寬和系統資源。GNU 編碼標準也建議，具有圖形界面的程序在適當情況下仍應提供命令行界面，以便腳本完成同樣任務。

現代軟體中，圖形界面和命令行界面經常共存。許多圖形工具會在後台調用命令行程序；許多命令行工具也會配合圖形終端、集成開發環境、Web 控制台或圖形化監控系統使用。二者的區別更多在於交互方式和使用場景，而不是誰完全取代誰。

## 類型

### 作業系統命令行界面

作業系統命令行界面通常由命令行解釋器、命令處理器或 shell 提供。它們接收使用者輸入，解析命令，判斷命令屬於內部命令還是外部程序，並把參數傳遞給相應程序。

類 Unix 系統常見的 shell 包括 Bourne shell、Bash、KornShell、C shell、tcsh、Z shell和fish等。Bash 手冊稱，Bash 大體兼容 `sh`，並吸收了 Korn shell 和 C shell 的有用特性，同時為交互和編程使用提供功能改進。

DOS 和 Windows 系統中，COMMAND.COM 是 MS-DOS 和 Windows 9x 的典型命令處理器；Windows NT 系列提供 cmd.exe。微軟文檔將 `cmd` 描述為啟動新的命令解釋器實例的命令。在 Windows 中，PowerShell進一步提供命令歷史、Tab 補全、命令預測、管道、別名和內置幫助等功能。

### 應用程式命令行界面

應用程式也可以提供自己的命令行界面。此類 CLI 不一定控制整個作業系統，而是控制某個程序、服務或運行環境。常見機制包括三類：其一是在啟動程序時通過參數傳遞文件名、配置項、調試開關或輸出格式；其二是程序啟動後進入交互式會話，顯示自己的提示符並持續接受命令；其三是通過標準輸入、標準輸出、管道或其他進程間通信機制接收來自其他程序的命令。

程式語言解釋器、資料庫、調試器、數學軟體和開發工具常使用這類方式。Python 官方文檔列出了解釋器可通過腳本文件、標準輸入、`-c` 命令字串或 `-m` 模塊名等方式運行代碼。Python 的 `sys.argv` 則保存傳遞給 Python 腳本的命令行參數列表。

### 遠程、嵌入式與設備命令行界面

伺服器、路由器、交換機、防火牆、存儲設備和嵌入式系統常提供命令行界面。此類界面通常通過本地串口、SSH、Telnet 或廠商管理工具訪問。與桌面操作相比，設備 CLI 更強調可腳本化配置、權限分級、批量部署和故障排查。網路設備命令行界面往往採用分層模式，例如使用者模式、特權模式、全局配置模式和接口配置模式；不同模式下可用命令不同。

### 網頁和遊戲中的命令行界面

命令行界面也可嵌入網頁、遊戲或其他非作業系統環境。部分網頁程序通過 JavaScript 終端模擬器提供類終端交互；jQuery Terminal 項目即說明其庫可用於在網頁中創建交互式命令行解釋器。許多電腦遊戲還提供「控制台」或調試命令行，供開發者調試、玩家輸入指令、修改變量或執行腳本。

## 命令行的組成

一個典型命令行可概括為：

```text
prompt command option argument ...
```

其中，`prompt` 是提示符，通常由命令行解釋器輸出；`command` 是使用者要執行的命令；`option` 是改變命令行為的選項；`argument` 是命令操作的對象。Bash 手冊說明，簡單命令由變量賦值、空格分隔的詞和重定向組成，shell 會對命令進行展開、重定向和執行。

### 提示符

提示符用於提示使用者當前可以輸入命令。類 Unix 系統中，普通使用者提示符常以 `$` 或 `%` 結尾，超級用戶提示符常以 `#` 結尾。Windows 命令提示符常顯示當前盤符和路徑，例如 `C:\Users\Name&gt;`。許多 shell 允許用戶自定義提示符，使其顯示使用者名稱、主機名、當前目錄、時間、Git 分支、退出狀態或遠程連接狀態等資訊。

### 內部命令與外部命令

命令可分為內部命令和外部命令。內部命令由命令行解釋器本身識別並執行，例如改變當前目錄、設置變量或控制腳本流程的命令。外部命令通常是獨立的可執行文件，shell 根據命令名稱和搜索路徑查找相應程序。Windows 的 `path` 命令用於設置 PATH 環境變量中的命令路徑，即指定系統搜索可執行文件的一組目錄。

### 參數與選項

命令行參數是程序啟動時收到的資訊。選項（option，也稱 switch 或 flag）用於改變命令行為。不同系統的選項風格並不完全相同。類 Unix 系統中，短選項常以一個連字符開頭，例如 `-l`；GNU 風格長選項常以兩個連字符開頭，例如 `--help`。DOS 和 Windows 程序中，斜槓選項較常見，例如 `dir /?`。GNU 編碼標準建議命令行程序支持常見的 `--help` 和 `--version` 選項，並鼓勵為單字母 Unix 風格選項提供對應的長選項。

命令行語法並非全球統一標準。作業系統、shell、應用程式和語言運行時都可能定義自己的解析規則。空格、引號、反斜槓、通配符和環境變量展開在不同 shell 中的行為也可能不同，因此可移植腳本通常應避免依賴過於特殊的解析行為。

### 管道與重定向

管道和重定向是命令行界面的關鍵機制。重定向可以改變命令讀取輸入或寫入輸出的位置，例如把輸出寫入文件、把錯誤輸出合併到標準輸出，或從文件讀取輸入。Bash 手冊說明，重定向允許命令的輸入、輸出在執行前被重定向到由 shell 解釋的文件。

管道把一個命令的輸出連接到下一個命令的輸入。Bash 手冊定義，管道是由 `|` 或 `|&` 等控制運算符分隔的一串命令，前一個命令的輸出通過管道連接到後一個命令的輸入。例如：

```bash
cat access.log | grep "404" | sort | uniq -c
```

該命令把日誌內容依次交給 `grep`、`sort` 和 `uniq` 處理，從而統計含有 `404` 的重複記錄。

## 腳本與自動化

命令行界面的一項重要用途是腳本化。使用者可以把一組命令保存到文件中，由 shell 或解釋器按順序執行。類 Unix 系統中的 shell script、DOS 和 Windows 中的 batch file、PowerShell 腳本，以及 Python、Perl、Ruby 等腳本語言，都可用於自動化文件處理、系統管理、構建部署、數據轉換和測試流程。

腳本化使命令行界面具有可復現性。一次手工完成的複雜操作，只要抽象為腳本，就可以在多台機器、多組數據或多個項目中重複執行。持續集成系統、包管理器、容器構建工具和雲平台命令行工具普遍依賴這種特性。

同時，腳本也帶來風險。錯誤命令可能批量刪除文件、覆蓋配置或影響生產服務；從網際網路複製命令執行也可能引入安全問題。因此，在執行高權限命令或批量腳本前，通常應檢查命令含義、確認路徑、使用預演選項，並儘量採用版本控制和備份機制。

## 其他命令行接口

命令行提供了程序和使用者之間的接口。從這個意義上說，命令行是對話框的替代方法。編輯器和資料庫可以呈現一個命令行，替代命令處理器可以在其中工作；有的程序也會在命令行選項中打開對話框或圖形窗口。

許多程序都帶有自己的命令行接口。例如 BASIC、`diskpart`、Edlin、QBASIC、資料庫 shell、調試器和計算器式程序，都可以使用命令行或類似對話的方式輸入指令。Emacs也提供了 minibuffer 形式的命令輸入區域，命令和參數可使用 Emacs 的文本編輯功能輸入，輸出則可顯示到另一個緩衝區中。

有許多文本模式遊戲，其中使用者在螢幕底部輸入命令。使用者可以通過輸入類似「取得戒指」或「查看」等命令來控制角色，程序則返回一段文字，描述角色看到的內容，或者說明角色執行動作後的結果。經典文字冒險遊戲Colossal Cave Adventure即依賴使用者輸入簡短英文命令推動遊戲；一個公開的 Colossal Cave Adventure 項目說明，該遊戲通過簡單英文命令讓使用者輸入下一步要做的事情。

這些接口中最值得注意的是標準流接口，它允許將一個命令的輸出傳輸到另一個命令的輸入。文本文件也可以用於類似目的。它為管道、過濾器和重定向提供接口。在 Unix 中，設備也可被視為文件，因此用於 `stdin`、`stdout` 和 `stderr` 的常見文件類型可以是 tty 設備文件。

另一個命令行界面允許 shell 程序運行輔助程序，以打開文檔或啟動程序。命令在 shell 內部處理，然後傳遞給另一個程序以運行文檔或程序。Windows 和 OS/2 的圖形界面在許多場景下也依賴傳遞給其他程序的命令行，這些程序可以是控制台程序，也可以是圖形程序。

網上瀏覽器 URL 輸入欄位可以用作命令行。它可用於啟動 Web 應用程式、訪問瀏覽器配置頁面以及執行搜索。瀏覽器地址欄和搜尋引擎結合後，使用者可通過短文本輸入觸發站內搜索、計算、單位換算或打開特定網頁。網頁自身也可模擬命令行環境，JavaScript 終端庫即提供了在瀏覽器中建立命令行式 Web 應用的能力。

還有一些 Web SSH 或遠程終端應用，允許用戶在瀏覽器中訪問伺服器命令行界面。部分伺服器安全配置還會通過命令行完成，例如 KnownHost 的技術文檔說明，埠敲門（port knocking）可以通過 CLI 修改 CSF/LFD 配置並重啟防火牆。

## 常見的CLI程序

- bash / sh / ksh / csh / zsh / fish（Unix-like系統）
- COMMAND.COM（MS-DOS系統）
- DIGITAL命令語言（VMS）
- cmd.exe / 命令提示符（Windows NT和Windows CE系統）
- Windows PowerShell（支持.NET Framework技術的 Windows NT 系統；現代 PowerShell 也可跨平台運行）
- Python、Ruby、Lua等程式語言解釋器的交互式命令行
- SQLite、MySQL、PostgreSQL等資料庫系統的命令行客戶端
- Cisco IOS、Junos OS等網路設備管理系統的命令行環境

## 可用性與輔助功能

命令行界面常被批評為缺少視覺提示，不容易發現可用功能。為彌補這一點，許多 CLI 程序提供 `-h`、`--help`、`/?`、`help` 等幫助選項，也支持自動補全、歷史記錄、命令預測、語法高亮、彩色提示符和錯誤建議。PowerShell 文檔列出了命令歷史、Tab 補全、命令預測、命令別名、管道、控制台內幫助系統等功能。

對熟練使用者而言，命令行界面可顯著減少重複操作；對初學者而言，文件路徑、權限、轉義、引號、編碼和環境變量等概念容易造成錯誤。現代終端模擬器和 shell 框架通過可視化提示、歷史搜索、補全菜單和錯誤糾正降低了部分門檻，但命令行的精確性要求仍高於多數圖形界面。

## 外部連結

- Windows 命令 － Microsoft Learn
- Bash Reference Manual － GNU Project
- Command Line Shell For SQLite － SQLite