命令行界面

命令行界面（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