命令行:为什么人们还在纠结于它们?

命令行已有近50年的历史,但它并没有过时。即使在图形桌面和触摸屏小工具的时代,基于文本的终端仍然是完成许多任务的最佳方式。

事实上,随着微软创建了一款功能强大的新Windows终端应用程序,命令行正变得比以往任何时候都更受尊重。Windows10的PowerShell环境令人惊讶地强大,但微软仍然不遗余力地向Windows10添加了对基本上完整的Linux命令行环境的支持。

命令行曾经是唯一的选项

曾经,如果您想与计算机交互,只需键入。就这样了。没有别的了。这听起来可能是限制性的和陈旧的,但作为不得不使用穿孔卡片或穿孔纸带的进步,打字是激进的和变革性的。从带着纸卷的电传打字机迁移到带阴极射线管(CRT)屏幕的终端,是人机交互的另一个根本性转变。

这一步为交互式shell真正发挥作用铺平了道路。现在,您可以向计算机发送指令,并很快将响应显示在屏幕上。当您等待您的纸张打印输出从您的电传打字机中发出咔哒声时,再也不会发出咔哒咔哒的响声了。

很公平,但那是过去,现在是现在。计算是一种完全不同的游戏。除了明显被锁定的情况,如使用没有安装图形桌面环境的计算机,或者通过低带宽连接通过SSH使用远程计算机,控制无头或嵌入式系统,为什么要在图形桌面上使用命令行呢?

解释术语

有些人几乎可以互换使用命令行、终端窗口和shell等术语。那是不正确的行话。他们都有很大的不同。它们是相关的,但它们不是一回事。

终端窗口是运行电传终端仿真的图形桌面环境中的窗口。

外壳是在终端窗口内运行的程序。它接受您的输入,并根据您键入的内容,尝试解释和执行指令本身,将它们传递给组成操作系统的一些其他实用程序,或者查找与您键入的内容匹配的脚本或程序。

相关:Bash、Zsh和其他Linux shell有什么不同?

命令行是您键入的位置。它是外壳在等待您输入某些指令时显示的提示。术语“命令行”也用于指代您键入的内容的实际内容。例如,如果您与其他计算机用户谈论您在尝试运行程序时遇到的困难,他们可能会问您,“您使用的是什么命令行?”他们不会问您使用的是什么shell;他们想知道您输入了什么命令。

总而言之,这些组合在一起形成了命令行界面(CLI)。

为什么在2019年使用命令行?

对于那些不熟悉CLI的人来说,CLI可能看起来是倒退的和令人困惑的。现代操作系统肯定没有这种过时的、令人讨厌的电脑使用方式的立足之地吧?几十年前,当窗口、图标和鼠标出现,具有图形用户界面(GUI)的图形桌面环境出现时,我们不是已经放弃了所有这些吗?

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

在Unix和Linux中使用的X Window系统于1984年引入。这为Unix及其众多衍生产品、克隆和副产品带来了图形化桌面环境。

但是Unix的发布比这些事件早了十多年。而且由于别无选择,一切都必须通过命令行来实现。在所有的人工交互、所有的配置中,智能计算机的每一次使用都必须能够通过简陋的键盘来执行。

因此,事实上,CLI可以做任何事情。GUI仍然不能完成CLI所能做的一切。即使对于它能做的部分,CLI通常也更快、更灵活、可以编写脚本,并且是可伸缩的。

这是有标准的。

它们是标准化的,这要归功于POSIX

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

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

但是打开候机楼的窗户,你会有宾至如归的感觉。

命令旨在协同工作

每个Linux命令都被设计用来做一些特定的事情,并且做得很好。基本的设计理念是通过添加另一个实用程序来添加更多功能,该实用程序可以与现有实用程序通过管道或链接在一起,以实现所需的结果。

这是如此有用,以至于微软不遗余力地在Windows10中添加了对完整Linux命令行的支持!

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

请看下面的示例。这将使用ls命令列出当前目录中的文件。结果通过管道传输到SORT命令,并根据第五列数据(即文件大小)进行排序。然后,排序后的列表通过管道传输到head命令,该命令默认列出其输入的前十行。

ls -l | sort -nk5,5 | head

我们得到了当前目录中最小文件的整齐列表。

通过更改一个命令-使用Tail而不是Head-我们可以获得当前目录中十个最大文件的列表。

ls -l | sort -nk5,5 | tail

不出所料,这为我们提供了十个最大文件的列表。

命令的输出可以重定向并捕获到文件中。可以分别捕获常规输出(Stdin)和错误消息(Stderr)。

相关:Linux上的stdin、stdout和stderr是什么?

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

ls $HOME

这可以从您恰好在目录树中的任何位置运行。

如果所有这些打字的想法仍然困扰着你,像制表符补全这样的技术可以减少你必须打字的数量。

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

人类很容易出错。

脚本允许您标准化一组指令,您知道这些指令将在每次运行脚本时以相同的方式执行。这为系统维护带来了一致性。可以将安全检查内置到脚本中,以允许脚本确定是否应该继续。这使得用户不需要有足够的知识来自己做出决定。

由于您可以在Linux和其他类似Unix的系统上使用cron软件自动执行任务,因此可以简化漫长、复杂和重复性的任务,或者至少计算出一次,然后在将来自动执行。

PowerShell脚本在Windows上提供类似的功能,您可以安排它们从Task Scheduler运行。既然可以运行自动更改所有内容的命令,为什么每次设置计算机时都单击50个不同的选项?

两全其美

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

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

命令行上瘾者并不讨厌GUI。他们只是喜欢使用CLI的好处-用于适当的任务。在管理方面,CLI轻松取胜。您可以使用CLI更改一个文件、一个目录、选定的文件和目录或完全全局更改,所需工作量相同。尝试使用GUI执行此操作通常需要冗长且重复的键盘和鼠标操作,因为受影响对象的数量会增加。

命令行为您提供最高的保真度。每个命令的每个选项都是可用的,而且很多Linux命令都有很多选项。仅举一个示例,请考虑lsof命令。看看它的手册页,然后考虑如何将其包装到GUI中。

有太多选项无法在有效的GUI中呈现给用户。这将是压倒性的,没有吸引力,使用起来也很笨重。这与GUI的目标完全相反。

这是赛马场上的马匹。不要回避CLI马。它通常是更快、更敏捷的骏马。赢得你的马刺,你永远不会后悔。

相关文章