命令行:为什么人们仍然使用它们?

命令行界面(CLI)的历史可以追溯到大约 50 年前,但它远未过时。即便在图形桌面和触摸屏设备盛行的今天,基于文本的终端仍然是许多任务的最佳解决方案。

事实上,随着微软开发出强大的新 Windows 终端应用程序,命令行反而得到了前所未有的重视。Windows 10 的 PowerShell 环境功能强大,但微软仍在不遗余力地为 Windows 10 添加对功能完整的 Linux 命令行环境的支持。

命令行曾经是唯一选择

曾几何时,如果您想与计算机交互,唯一的途径就是输入文本。别无他法。这听起来可能有些局限和老旧,但作为从使用穿孔卡片或纸带的进步,键盘输入已是具有革命意义的重大飞跃。从带有纸卷的电传打字机到阴极射线管(CRT)屏幕的转变,也标志着人机交互的又一次重大变革。

这一步为交互式 shell 的真正发展奠定了基础。现在,您可以向计算机发送指令,并快速在屏幕上看到响应。 不再需要等待电传打字机咔哒作响地输出纸张。

当然,那已是过去,现在是另一番景象。计算已经发生了翻天覆地的变化。除了诸如使用没有安装图形桌面环境的计算机,或者通过SSH使用低带宽连接远程控制,或者控制无头嵌入式系统等显而易见的场景外,为什么还要在图形桌面上使用命令行呢?

术语解析

有些人习惯性地将命令行、终端窗口和 shell 这些术语混用。 然而,这是不严谨的。它们彼此不同。它们相互关联,但不是同一件事。

终端窗口是一个图形桌面环境中运行的电传打字终端的模拟器。

shell 是在终端窗口内运行的程序。它接收您的输入,尝试解释并执行您输入的指令,将其传递给构成操作系统的其他实用程序,或者查找与您输入内容相匹配的脚本或程序。

命令行是您键入指令的位置。它是 shell 在等待您输入命令时显示的提示符。“命令行”一词也用来指代您实际键入的内容。例如,如果您与其他计算机用户讨论运行程序时遇到的问题,他们可能会问:“你使用了什么命令行?”他们并不是问你使用的是什么 shell,而是想知道你输入了什么命令。

总之,这些组成了一个命令行界面(CLI)。

为何在 2019 年还要使用命令行?

对于不熟悉 CLI 的人来说,它看起来像是一种倒退,令人困惑。在现代操作系统中,难道不应该放弃这种过时且令人沮丧的计算机交互方式吗?难道图形桌面环境(GUI)带来的窗口、图标和鼠标,不是几十年前就已经出现并取而代之了吗?

是的,GUI 已经存在了几十年。Microsoft Windows 的第一个版本早在 1985 年就发布了,并且随着 1990 年 Windows 3.0 的发布而成为 PC 桌面的标准。

用于 Unix 和 Linux 的 X Window 系统于1984 年推出,为 Unix 及其众多衍生产品、克隆和分支带来了图形桌面环境。

但是 Unix 的发布早于这些事件十多年。由于当时别无选择,一切都必须通过命令行来完成。所有的人机交互、所有配置、计算机的每次使用都必须通过键盘来完成。

所以,事实上,CLI 可以完成任何事情。GUI 仍然不能完成 CLI 可以完成的所有事情。即便对于 GUI 可以完成的部分,CLI 通常更快、更灵活、可编写脚本且具有可扩展性。

而且它具有标准化。

POSIX 标准化的功劳

POSIX 是一个类 Unix 操作系统的标准——基本上涵盖了所有非 Windows 系统。甚至 Windows 也提供了适用于 Linux 的 Windows 子系统(WSL)。在任何兼容 POSIX(或接近兼容)的操作系统上打开一个终端窗口,您都会发现自己身处 shell 中。即便 shell 或发行版提供了自己的扩展和增强功能,只要它们提供核心 POSIX 功能,您就可以立即使用。您的脚本也将能够顺利运行。

命令行是最小公分母。了解如何使用它,无论 Linux 发行版和图形桌面环境如何,您都可以执行所需的所有任务。不同的桌面有自己的做事方式。不同的 Linux 发行版捆绑了各种各样的实用程序和程序。

但是,只要打开终端窗口,您就会有宾至如归的感觉。

命令协同工作

每个 Linux 命令都旨在执行特定的操作并做好某件事。其基本的设计理念是通过添加另一个实用程序来扩展功能,该实用程序可以与现有实用程序通过管道连接或链接,从而实现所需的结果。

这种方式非常有效,以至于微软不遗余力地为 Windows 10 添加了对完整 Linux 命令行的支持!

例如,sort 命令用于对文本进行字母排序。无需在每个其他 Linux 命令中都构建排序功能。通常,GUI 应用程序不允许这种类型的协作互通。

请看以下示例。它使用 ls 命令列出当前目录中的文件。结果通过管道传输到 sort 命令,按第五列数据排序(即文件大小)。然后将排序后的列表通过管道传递给默认情况下列出其输入的前十行的 head 命令。

ls -l | sort -nk5,5 | head

这样我们就得到了当前目录中最小文件的简明列表。

通过更改一个命令(使用 tail 代替 head),我们可以得到当前目录中最大的 10 个文件的列表。

ls -l | sort -nk5,5 | tail

正如预期,这提供了十个最大文件的列表。

命令的输出可以在文件中重定向和捕获。可以分别捕获常规输出 (stdin) 和错误消息 (stderr)。

命令可以包含环境变量。以下命令将列出您的主目录的内容:

ls $HOME

无论您当前身处目录树的哪个位置,该命令都有效。

如果您仍然觉得打字很麻烦,那么制表符自动补全等技术可以减少您必须键入的内容。

脚本实现自动化和可重复性

人容易犯错。

脚本允许您标准化一组指令,确保每次运行脚本时都以相同的方式执行。这为系统维护带来了一致性。安全检查可以内置到脚本中,允许脚本确定是否应该继续执行,从而消除了用户需要具备足够知识做出决定的需要。

通过在 Linux 和其他类 Unix 系统上使用 cron 来自动化任务,繁琐、复杂和重复的任务可以被简化,或至少可以解决一次,然后在未来实现自动化。

PowerShell 脚本在 Windows 上提供了类似的功能,您可以安排它们从任务计划程序运行。当您可以使用一个命令自动更改所有内容时,为什么还要在每次设置计算机时单击 50 个不同的选项?

两全其美

要充分利用 Linux(或作为高级用户的任何操作系统),您确实需要同时使用 CLI 和 GUI。

GUI 在使用应用程序方面是无与伦比的。即使是坚定的命令行拥护者也时不时地需要走出终端窗口,使用办公生产力套件、开发环境和图形操作程序。

命令行爱好者并不讨厌 GUI,他们只是喜欢使用 CLI 的好处,即将其用于适合的任务。对于管理,CLI 占据优势。您可以使用 CLI 对单个文件、目录、一组文件和目录进行更改,或者以相同的工作量进行完全全局的更改。随着受影响对象数量的增加,尝试使用 GUI 执行此操作通常需要漫长且重复的键盘和鼠标操作。

命令行提供了最高的精度。每个命令的每个选项都供您使用。而且许多 Linux 命令都有大量的选项。仅举一个例子,考虑 lsof 命令。看看它的手册页,然后思考如何将其包装到 GUI 中。

在一个有效的 GUI 中呈现给用户的选项实在太多了,这会让人感到不知所措、毫无吸引力且使用起来很笨拙。这与 GUI 的目标完全背道而驰。

各有所长。不要回避 CLI 这匹骏马,因为它通常更快、更灵活。磨砺你的技能,你永远不会后悔。