习惯命令行界面 (CLI) 有很多很好的论据。然而,作为一个完全的初学者,开始可能会很困难,而且新的 shell 会话可能会让人感到有点害怕:
让我们了解一下 CLI 基础知识!
您首先需要的是一个终端仿真器:一个模拟对您机器的纯文本访问的程序。任何操作系统 (OS) 都会有大量的模拟器可供选择:它们都非常相似,主要区别在于:
一开始,您应该对操作系统或集成开发环境 (IDE) 中可用的内容感到满意。
Shell 是一个程序,可以解释您的命令并为您运行程序。它与我们上面谈到的终端模拟器不同。在某种程度上,在您的图形界面中,您打开终端,在终端内部,您有一个纯文本的命令解释器。
有许多可用的选项,细微的差异可以极大地改变用户体验。
Z shell 或 Zsh 是一种现代且流行的命令解释器。它的界面是用户友好的,并且有可用的社区包,允许您自定义您的 shell 体验: Oh My Zsh 。我已经使用它几年了,我的大部分 CLI 习惯都是从它改编而来的。
Bash 是 Zsh 的稍微老一点的替代品。它很常见,因此您可以期望它可以在您在那里遇到的许多机器上使用。 Zsh 的许多快捷方式也在那里工作,但它使用不同的配置文件,并且脚本语言有点不同。
标准外壳。它是标准 Unix 命令的一部分,而且它几乎可以保证在您能找到的任何类 Unix 机器上都可以使用。因此,在编写脚本时,这是一个安全的选择。
用户界面缺少许多现代改进,因此除了连接脚本外,我不会将其用于任何其他用途。
就我而言,它是zsh
每个 shell 都是一个程序,可以直接从另一个 shell 运行。例如:
通过这种方式,您可以检查您安装了哪些 shell 并快速测试它们。要永久更改 shell,您可以在 Linux 和 macOS 中使用命令chsh
(更改 shell):
如果您缺少要使用的 shell,则需要先安装它——确切的命令取决于您的操作系统或 Linux 发行版。
那么,一旦您启动并运行了终端,您将如何使用它?
CLI 允许您通过在终端中键入命令名称并按回车键来运行命令。每个命令都是一个单独的程序,提供了广泛的界面,每个命令都有自己的文档。
同样,每个操作系统都有自己的一组命令,但它们有相似之处——尤其是受 Unix、macOS 和 Linux 启发的系统。
在 Windows 上,标准命令行cmd
有一组非常不同的命令,但也有许多选项可用于获得类似的界面:
Unix 是一个在 1973 年公开可用的操作系统,它影响了后来的很多事情。它的当前规范定义了161 个命令,但幸运的是,您只需要其中的一小部分即可从 CLI 中受益。
命令示例:
pwd
显示您运行命令的当前路径:
cd
更改目录——默认情况下它转到主目录( https://asciinema.org/记录或截图)
每个命令都可以接受额外的参数。参数是命令名称之后的空格分隔值。参数的含义取决于程序。您可以在命令文档中阅读有关不同参数的信息:
许多标准命令带有不同的选项,允许您修改程序的行为。例如, ls
经常与以下选项一起使用:
-a
— 显示所有文件,包括以.
—隐藏文件的 Unix 约定
-l
以长格式显示文件——提供更多信息
一个常见的约定是允许选项作为单独的参数, ls -a -l
,或组合成一个参数, ls -la
。
参数是为命令或其选项之一提供值的参数。
因此,例如,对于上面的示例,您可以提供更改默认行为的路径:
参数的含义取决于程序——起初,您可能需要大量查看文档。
标准输出是运行程序时添加到命令行的文本。它的文本由执行的快乐路径显示。到目前为止,我们看到的示例显示了不同命令的标准输出。
学习 C++ 时,首先要学习的东西之一就是cout
标准输出。
默认情况下,标准输出仅显示在屏幕上,但您可以使用>
运算符轻松地将其重定向到文件。例子:
错误输出是程序显示有关执行过程中遇到的问题的信息的地方。直接从终端运行命令时,错误输出和标准输出的处理方式相同——它们只是显示在屏幕上。例如,当我尝试ls
一个不存在的文件时:
当您将输出重定向到一个文件时,区别就变得很明显了:
在正常的工作流程中,标准输入是您在程序中输入的内容。到目前为止我们看到的命令通常不用于交互模式。一个简单的示例可以是允许滚动的man
页:
对于那些有 C++ 经验的人,您听说过cin
这个术语:
cin >> variable;
对于许多常用命令,由于管道运算符,标准输入变得尤为重要。
管道是将一个程序的标准输出与另一个程序的标准输入连接起来的方法。这就是 CLI 如何实现我在上一篇文章中提到的互操作性。
使用管道可以让您以多种创造性的方式组合不同的命令——我将在本系列的后面展示一些示例。现在,一个简单的例子是:
在哪里:
cat …
读取文件并在标准输出中返回它们的内容,
less
— 从标准输入获取值,并使其适合屏幕
同样,通过使用搜索实用程序grep
:
在哪里:
cat …
——如上
grep 1
— 从标准输入中获取值,并将其过滤为仅包含1
的行。我们已经提到了用于将命令的标准输出写入文件的>
运算符。此运算符使用我们提供的输出覆盖文件。如果您想将其附加到现有文件,您可以使用>>
代替。
命令行中发生的一切都是在特定磁盘位置(工作目录)的上下文中完成的。当您指定相对文件路径(用于读取或写入)时,它们将从工作目录中解析。
通常,您将工作目录设置为您正在处理的项目的顶级文件夹。当您开始一个新会话时,工作目录通常设置为您的主目录。
Shell 解释器为您提供了许多快捷方式来加快您的工作。随着时间的推移,您将开始凭直觉使用它们,而无需考虑它们。
通常,当我与初学者进行屏幕共享时,我会想起这些快捷方式不过是显而易见的 — 下面,我将向您展示一些使用命令行提高效率的技巧。
我自己在使用 Zsh,这些快捷方式在那里工作。至少其中一些也应该在 Bash 中工作,但这可能取决于确切的版本和配置。
快速使用 CLI 的主要技巧是不要一直输入所有内容。最基本的情况是取回您之前运行过的命令。您可以通过按向上箭头键来执行此操作。
使用向上箭头和向下箭头,您可以滚动浏览最近的命令,一旦找到与您现在要运行的命令相似的命令,您就可以对其进行编辑。这大大加快了整个过程,因为您经常运行类似的命令,但参数略有不同。
手动滚动可以很好地获取一条或几条最近的命令。但是,如果您想进一步了解过去,可以使用搜索功能。默认情况下,您可以使用的命令是 CTRL + R 开始在命令历史记录中进行搜索:
您不必键入要运行的整个命令。 Zsh 和 Bash 都支持将 Tab 键作为一种请求自动填充的方式——如果它们是唯一的,它们将填充命令或文件名,或者如果您键入的内容符合多种可能性,它们将向您显示所有可用选项。
Zsh 也为命令选项提供自动填充。
自动填充在两个层面上是一项很棒的功能:它可以帮助您节省打字时间,并减少错误。在学习 CLI 时,您应该确保养成尽可能多地使用自动完成的习惯。
您可以通过使用通配符来匹配多个文件的名称来加快键入速度:
通常,当一个程序的输出太多以至于无法显示在屏幕上时,它会使用另一个程序作为分页器——一种允许您导航输出并上下滚动的工具。大多数情况下,用于此的程序less
。使用时有几点值得注意。
首先,不要使用终端模拟器提供的滚动条进行滚动。 less
在输出结束时重绘整个屏幕的文本。
如果在终端仿真器中向上滚动,您将看到之前其他程序返回的内容,而不是您要读取的文件的内容。不要使用滚动条(滚轮)滚动,而是使用上下箭头在文件中移动。
另一个常见的困惑点——我现在该如何离开?您可以通过按q
离开“less”的全屏模式。它通常被设计为:q
因为其他程序(例如vim
)使用:
来启动命令。
在命令行中,一切都是文本,文本很容易搜索。您可以通过键入/<search term>
在 less 显示的内容中进行搜索,并通过键入n
和N
浏览结果:
less
支持其他类似于vim
中的导航命令:
j
—向下滚动一行k
—向上滚动一行gg
滚动到文件开头G
滚动到文件末尾d/u
—下/上半屏
这些快捷方式将帮助您快速浏览文件。
那太棒了!命令行是提高编程效率的好工具。当我发布其他与命令行相关的材料时,您可以在此处注册以获取我的更新。
也发布在这里